SlideShare une entreprise Scribd logo
1  sur  24
Télécharger pour lire hors ligne
Symfony2 y Elasticsearch
Gonzalo Míguez
¡Oigo voces! ¿Quién me habla?
● Gonzalo Míguez
– Pito del Sereno en ChicPlace.com (AKA: CTO)
– Anteriormente:
● Forgotten suggestions lead en Pinroom.com
● Ignored modernization evangelist en Budgetplaces.com
● Lead Bug Creator en Motofan.com
● Solo ante el peligro en Infoelder.com
– En twitter: mrzard_dev / En GitHub: mrzard
– He trabajado con Elasticsearch en plan “vamos a probar cosas” 1
año, y más 'seriamente' los últimos 3-4 meses.
¿Qué es Symfony2?
● Me parece que te has equivocado de charla...
● Pero bueno, para resumir.. Es un framework así muy rico,
hecho en PHP, ese lenguaje que todos sabemos que tiene una
API maravillosa y tal.
● Este señor es su Dios:
Fijaos si es majo que os manda un beso.
¿Qué es Elasticsearch?
● En sus propias palabras: Elasticsearch is a powerful open source search and
analytics engine that makes data easy to explore.
● En llano: Elasticsearch es un software que nos ayuda a implementar una
búsqueda full-text potente sin tener que arrancarnos los pelos.
● Creado por Shay Banon en 2010.
● Sobre Apache Lucene (Como Solr)
● Pensado para entornos distribuidos “out-of-the-box”
● API Rest, datos en JSON. Todo se puede hacer con curl.
● Github, Wordpress, Stackoverflow y un montón más lo usan.
● Escrito en Java. Trae su propio servidor Jetty.
● Instalación:
– Sencillísima: sudo dpkg -i elasticsearch.deb
● Por defecto correrá en localhost:9200
¿Qué es Apache Lucene?
● Librería de búsqueda FullText
● Veterana: Primera versión de 1999
● Elasticsearch:
– API
– Distribución
– Expone las funcionalidades de Apache Lucene
Conectando Elasticsearch y Symfony2
● Muy fácil gracias al FOSElasticaBundle
● FOSElasticaBundle une Elastica, el cliente de Elasticsearch
para PHP, y Symfony2.
● A tener en cuenta:
- Ahora mismo, nos ata a Elasticsearch 0.90.* :(
Ejemplo: Configuración Básica
Ejemplo: Configuración Básica (2)
● Estructura de Elasticsearch:
– index ('db')
● type ('table')
– document ('row')
● field ('column')
● Por defecto, los fields string se analizan con el analyzer
standard.
Limitaciones
1) Mapea properties con fields 1-1
✗ No suele ser la solución óptima para búsqueda
2) Comando populate: tira de QueryBuilder de Doctrine
✗ trabaja con las entities enteras (LEEEEENTO)
3) Todos los textos pasarán por el standard analyzer,
✗ No es efectivo para todos los casos
Ejemplo: Configuración Básica (3)
● Mapeado de campos:
– Cada field de un type puede ser de un tipo diferente
– Los tipos por defecto de ElasticSearch son:
● String
● Integer / Long
● Float / Double
● Boolean
● Null
¡Pero no es suficiente!¡Necesito MÁS!
● Si el mapeado de tu entity es insuficiente:
– 'nested' types: 'embeben' un subdocumento.
– Ejemplo: El documento 'movie' -> subdocs 'actor'
– 'object' type: Igual que 'nested', pero apoyado en
relaciones de Doctrine
– multi_field:
● Reemplazado por 'fields' en la 1.0
● ¡IDEA!
– integer y string pueden ser arrays de ints o strings
Analyzers
● Ejemplos de Analyzers:
– Analyzer: Token
– Elasticsearch → Analyze API!
– Con “Dr. Strangelove or: How I Learned to Stop Worrying
and Love the Bomb
Analyzer Tokens
Simple dr | strangelove | or | how | i | learned | to | stop |
worrying | and | love | the | bomb
Standard dr | strangelove | how | i | learned | stop | worrying | love
| bomb
English dr | strangelov | how | i | learn | stop | worri | love | bomb
Spanish dr | strangelov | or | how | i | learned | to | stop | worrying
| and | love | the | bomb
Keyword “Dr. Strangelove or: How I Learned to Stop Worrying and
Love the Bomb” (1 token)
Ejemplo: Búsqueda
Ejemplo: Búsqueda
● FOSElasticaBundle
– Acceso a índices: 'fos_elastica.index.{index_name}.{type_name}'.
● En el ejemplo: fos_elastica.index.symfony_bcn_example.
(movie|genre|director|actor)
● Queries: Hechas con Elastica.
Consideraciones
● Elastica proporciona tipos de queries mucho más complejas
– QueryString: La más potente y configurable (bastante
familiar para los que vienen de Solr)
● FOSElasticaBundle:
– Finder: ElasticaQuery → Entities
● Paginadores (knp_paginator, pagerfanta)
– Listeners (insert, update, delete)
● No está disponible para el driver propel.
Limitaciones: Soluciones (1)
● Evitar mapeado 1-1 con la entity:
– provider (para el populate)
– model_to_elastica_transformer (para los listeners).
– Normalmente el mapping 1-1 no es bueno para la
búsqueda
● 'Copia de BD' vs 'Datos para buscar'
Limitaciones: Soluciones (2)
● Provider: service que implementa ProviderInterface de
FOSElasticaBundle.
– Queries personalizadas. Mejora de velocidad.
● model_to_elastica_transformer: Service que debe
implementar ModelToElasticaTransformerInterface,
– 'traducirá' nuestra entity a Document de Elastica.
– (Ejemplo: ModelToElasticaAutoTransformer de
FOSElasticaBundle)
Limitaciones: Soluciones (3)
● Para no usar siempre el analyzer standard:
– Definir un analyzer por field
– Analyzers nativos de Elasticsearch: Standard, Simple,
Whitespace, Stop, Keyword, Pattern, Language, Snowball y
Custom
– Custom analyzer: permite escoger nuestra combinación
propia de tokenizer + token filter
Limitaciones: Más cosas a considerar
● Si usamos el finder:
– elastica_to_model_transformer:
● traduce id's de Elastica a Entities.
● Ejemplo de uso: eager loading de colecciones
asociadas (caso típico: cargar traducciones)
Búsqueda: Query vs Filters
● Al buscar, ojo con Query vs Filter.
– Queries
● afectan al 'scoring' de los resultados. (Cómo de bueno
es el match).
● No pueden ser cacheados
– Filters
● Afectan a qué resultados se muestran. (No afecta al
scoring).
● Se pueden cachear
– Para acelerar búsquedas, pasemos a Filters lo que
podamos.
Búsqueda: Facets
● Típico conteo de hits por
categoría
● No están afectados por los
Filters, pero se les puede
aplicar sus propios Filters
● OJO AL LÍO: Hay
FacetFilters para los
Facets. No confundir con los
FilterFacets, que es crear
un facet a partir de un filter
● Ejemplo: Dado un director,
contar en cuántas películas
de cada género ha
participado.
Percolator
● Es una especie de búsqueda inversa:
– Dado un resultado, ¿qué queries satisface?
● Funcionamiento
– Nombramos nuestras queries, y las registramos en el
percolator
– Cuando un documento haga match con una de las queries
registradas, el percolator nos los dirá.
● Percolator:
– “Hay un nuevo documento que cumple con la condición X”
Show me the code!
● Podéis encontrar el código usado en esta presentación en:
– https://github.com/mrzard/symfony2-elasticsearch-example
● Si pedís/tenéis una API key de tMDB - http://www.themoviedb.org/ -
hay un command para cargar 250 películas con sus actores,
directores y géneros.
● Cosas a probar:
– Otros analyzers (o crear los tuyos propios).
– Hacer el típico 'autocomplete' al buscar
– Intentar sacar estadísticas con los facets adecuados
– Crear vuestro propio provider y ver la diferencia en la velocidad
de indexación.
● Happy coding!
¡GRACIAS!

Contenu connexe

En vedette

Recent industry developments pose questions about the operators role
Recent industry developments pose questions about the operators roleRecent industry developments pose questions about the operators role
Recent industry developments pose questions about the operators role
xmendel
 
Proyecto biogas urbano e r s - pio ernesto ruiz lara-v 1-5_9
Proyecto biogas urbano    e r s - pio ernesto ruiz lara-v 1-5_9Proyecto biogas urbano    e r s - pio ernesto ruiz lara-v 1-5_9
Proyecto biogas urbano e r s - pio ernesto ruiz lara-v 1-5_9
Pio Ruiz
 
CONVÊNIO UNIÃO SINDICAL CHAPECÓ E REGIÃO
CONVÊNIO UNIÃO SINDICAL CHAPECÓ E REGIÃOCONVÊNIO UNIÃO SINDICAL CHAPECÓ E REGIÃO
CONVÊNIO UNIÃO SINDICAL CHAPECÓ E REGIÃO
sinteimp
 
Curriculum vitae
Curriculum vitaeCurriculum vitae
Curriculum vitae
josexeng
 
Mateo reinoso carlos fajardo etapas de la luna
Mateo reinoso carlos fajardo etapas de la luna Mateo reinoso carlos fajardo etapas de la luna
Mateo reinoso carlos fajardo etapas de la luna
carlosf000
 
A practical intro to web development with mongo db and nodejs when, why and ...
A practical intro to web development with mongo db and nodejs  when, why and ...A practical intro to web development with mongo db and nodejs  when, why and ...
A practical intro to web development with mongo db and nodejs when, why and ...
jgarifuna
 
El duelo
El duelo El duelo
El duelo
David
 

En vedette (20)

Recent industry developments pose questions about the operators role
Recent industry developments pose questions about the operators roleRecent industry developments pose questions about the operators role
Recent industry developments pose questions about the operators role
 
IA and Assurance Path
IA and Assurance PathIA and Assurance Path
IA and Assurance Path
 
Science Update - No 270 - Apr 2016
Science Update - No 270 - Apr 2016Science Update - No 270 - Apr 2016
Science Update - No 270 - Apr 2016
 
Proyecto biogas urbano e r s - pio ernesto ruiz lara-v 1-5_9
Proyecto biogas urbano    e r s - pio ernesto ruiz lara-v 1-5_9Proyecto biogas urbano    e r s - pio ernesto ruiz lara-v 1-5_9
Proyecto biogas urbano e r s - pio ernesto ruiz lara-v 1-5_9
 
Prensa sobre almogia
Prensa sobre almogiaPrensa sobre almogia
Prensa sobre almogia
 
TeknoLab-IT
TeknoLab-ITTeknoLab-IT
TeknoLab-IT
 
CONVÊNIO UNIÃO SINDICAL CHAPECÓ E REGIÃO
CONVÊNIO UNIÃO SINDICAL CHAPECÓ E REGIÃOCONVÊNIO UNIÃO SINDICAL CHAPECÓ E REGIÃO
CONVÊNIO UNIÃO SINDICAL CHAPECÓ E REGIÃO
 
Racismo[1]
Racismo[1]Racismo[1]
Racismo[1]
 
Ventuno - India's leading ad monetized content syndication platform
Ventuno - India's leading ad monetized content syndication platformVentuno - India's leading ad monetized content syndication platform
Ventuno - India's leading ad monetized content syndication platform
 
AMS International
AMS InternationalAMS International
AMS International
 
2014 national-candidates-list1
2014 national-candidates-list12014 national-candidates-list1
2014 national-candidates-list1
 
Florilegio
FlorilegioFlorilegio
Florilegio
 
Curriculum vitae
Curriculum vitaeCurriculum vitae
Curriculum vitae
 
King gates catalogue_2016_en
King gates catalogue_2016_enKing gates catalogue_2016_en
King gates catalogue_2016_en
 
MP (1)
MP (1)MP (1)
MP (1)
 
Mateo reinoso carlos fajardo etapas de la luna
Mateo reinoso carlos fajardo etapas de la luna Mateo reinoso carlos fajardo etapas de la luna
Mateo reinoso carlos fajardo etapas de la luna
 
A practical intro to web development with mongo db and nodejs when, why and ...
A practical intro to web development with mongo db and nodejs  when, why and ...A practical intro to web development with mongo db and nodejs  when, why and ...
A practical intro to web development with mongo db and nodejs when, why and ...
 
El duelo
El duelo El duelo
El duelo
 
ACOSO ESCOLAR DE ESTUDIANTES CON IMPEDIMENTOS, Ernesto Perez , Ph.D.
ACOSO ESCOLAR DE ESTUDIANTES CON IMPEDIMENTOS, Ernesto Perez , Ph.D. ACOSO ESCOLAR DE ESTUDIANTES CON IMPEDIMENTOS, Ernesto Perez , Ph.D.
ACOSO ESCOLAR DE ESTUDIANTES CON IMPEDIMENTOS, Ernesto Perez , Ph.D.
 
Exposición: Ccleaner (Prof. Julio C.)
Exposición: Ccleaner (Prof. Julio C.)Exposición: Ccleaner (Prof. Julio C.)
Exposición: Ccleaner (Prof. Julio C.)
 

Similaire à Symfony2 and ElasticSearch

Ponele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu StartupPonele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu Startup
Martin Siniawski
 
Python 3
Python 3Python 3
Python 3
CHREAR
 

Similaire à Symfony2 and ElasticSearch (20)

Conceptos básicos y aplicaciones prácticas de programación para SEO
Conceptos básicos y aplicaciones prácticas de programación para SEOConceptos básicos y aplicaciones prácticas de programación para SEO
Conceptos básicos y aplicaciones prácticas de programación para SEO
 
Sistemas de recomendación & Big Data
Sistemas de recomendación & Big DataSistemas de recomendación & Big Data
Sistemas de recomendación & Big Data
 
Probando aplicaciones basadas en LLMs.pdf
Probando aplicaciones basadas en LLMs.pdfProbando aplicaciones basadas en LLMs.pdf
Probando aplicaciones basadas en LLMs.pdf
 
Argentesting 2017 - Performance testing 101 con jmeter
Argentesting 2017 - Performance testing 101 con jmeterArgentesting 2017 - Performance testing 101 con jmeter
Argentesting 2017 - Performance testing 101 con jmeter
 
Busqueda de informacion
Busqueda de informacionBusqueda de informacion
Busqueda de informacion
 
Buscadores
BuscadoresBuscadores
Buscadores
 
Busqueda de informacion
Busqueda de informacion Busqueda de informacion
Busqueda de informacion
 
Tabla comparativa
Tabla comparativa  Tabla comparativa
Tabla comparativa
 
Hack x crack_hacking_buscadores
Hack x crack_hacking_buscadoresHack x crack_hacking_buscadores
Hack x crack_hacking_buscadores
 
Hack x crack_hacking_buscadores
Hack x crack_hacking_buscadoresHack x crack_hacking_buscadores
Hack x crack_hacking_buscadores
 
Ponele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu StartupPonele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu Startup
 
Búsqueda de informacón en GOOGLE
Búsqueda de informacón en GOOGLEBúsqueda de informacón en GOOGLE
Búsqueda de informacón en GOOGLE
 
Google Hacking
Google HackingGoogle Hacking
Google Hacking
 
MÓDULO 1: BÚSQUEDA DE INFORMACIÓN EN GOOLE
MÓDULO 1: BÚSQUEDA DE INFORMACIÓN EN GOOLEMÓDULO 1: BÚSQUEDA DE INFORMACIÓN EN GOOLE
MÓDULO 1: BÚSQUEDA DE INFORMACIÓN EN GOOLE
 
Programacion Orientada a Objetos en python
Programacion Orientada a Objetos en pythonProgramacion Orientada a Objetos en python
Programacion Orientada a Objetos en python
 
Python 3
Python 3Python 3
Python 3
 
CTF una visión de equipo
CTF una visión de equipoCTF una visión de equipo
CTF una visión de equipo
 
Rooted2020 encontrando 0days-en_2020_-_antonio_morales
Rooted2020 encontrando 0days-en_2020_-_antonio_moralesRooted2020 encontrando 0days-en_2020_-_antonio_morales
Rooted2020 encontrando 0days-en_2020_-_antonio_morales
 
Gaston Riera @ SEOnderground
 Gaston Riera @ SEOnderground Gaston Riera @ SEOnderground
Gaston Riera @ SEOnderground
 
¡This is drupal!
¡This is drupal!¡This is drupal!
¡This is drupal!
 

Plus de symfony_bcn

Redis–symfony–barcelona–31 05-2012
Redis–symfony–barcelona–31 05-2012Redis–symfony–barcelona–31 05-2012
Redis–symfony–barcelona–31 05-2012
symfony_bcn
 

Plus de symfony_bcn (6)

Las buenas prácticas oficiales para aplicaciones Symfony
Las buenas prácticas oficiales para aplicaciones SymfonyLas buenas prácticas oficiales para aplicaciones Symfony
Las buenas prácticas oficiales para aplicaciones Symfony
 
Symfony2 admingenerator
Symfony2 admingeneratorSymfony2 admingenerator
Symfony2 admingenerator
 
Symfony and SSL
Symfony and SSLSymfony and SSL
Symfony and SSL
 
PaymentSuite
PaymentSuitePaymentSuite
PaymentSuite
 
Redis–symfony–barcelona–31 05-2012
Redis–symfony–barcelona–31 05-2012Redis–symfony–barcelona–31 05-2012
Redis–symfony–barcelona–31 05-2012
 
Marcos quesada caching_sf2
Marcos quesada caching_sf2Marcos quesada caching_sf2
Marcos quesada caching_sf2
 

Dernier

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Dernier (11)

Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 

Symfony2 and ElasticSearch

  • 2. ¡Oigo voces! ¿Quién me habla? ● Gonzalo Míguez – Pito del Sereno en ChicPlace.com (AKA: CTO) – Anteriormente: ● Forgotten suggestions lead en Pinroom.com ● Ignored modernization evangelist en Budgetplaces.com ● Lead Bug Creator en Motofan.com ● Solo ante el peligro en Infoelder.com – En twitter: mrzard_dev / En GitHub: mrzard – He trabajado con Elasticsearch en plan “vamos a probar cosas” 1 año, y más 'seriamente' los últimos 3-4 meses.
  • 3. ¿Qué es Symfony2? ● Me parece que te has equivocado de charla... ● Pero bueno, para resumir.. Es un framework así muy rico, hecho en PHP, ese lenguaje que todos sabemos que tiene una API maravillosa y tal. ● Este señor es su Dios: Fijaos si es majo que os manda un beso.
  • 4. ¿Qué es Elasticsearch? ● En sus propias palabras: Elasticsearch is a powerful open source search and analytics engine that makes data easy to explore. ● En llano: Elasticsearch es un software que nos ayuda a implementar una búsqueda full-text potente sin tener que arrancarnos los pelos. ● Creado por Shay Banon en 2010. ● Sobre Apache Lucene (Como Solr) ● Pensado para entornos distribuidos “out-of-the-box” ● API Rest, datos en JSON. Todo se puede hacer con curl. ● Github, Wordpress, Stackoverflow y un montón más lo usan. ● Escrito en Java. Trae su propio servidor Jetty. ● Instalación: – Sencillísima: sudo dpkg -i elasticsearch.deb ● Por defecto correrá en localhost:9200
  • 5. ¿Qué es Apache Lucene? ● Librería de búsqueda FullText ● Veterana: Primera versión de 1999 ● Elasticsearch: – API – Distribución – Expone las funcionalidades de Apache Lucene
  • 6. Conectando Elasticsearch y Symfony2 ● Muy fácil gracias al FOSElasticaBundle ● FOSElasticaBundle une Elastica, el cliente de Elasticsearch para PHP, y Symfony2. ● A tener en cuenta: - Ahora mismo, nos ata a Elasticsearch 0.90.* :(
  • 8. Ejemplo: Configuración Básica (2) ● Estructura de Elasticsearch: – index ('db') ● type ('table') – document ('row') ● field ('column') ● Por defecto, los fields string se analizan con el analyzer standard.
  • 9. Limitaciones 1) Mapea properties con fields 1-1 ✗ No suele ser la solución óptima para búsqueda 2) Comando populate: tira de QueryBuilder de Doctrine ✗ trabaja con las entities enteras (LEEEEENTO) 3) Todos los textos pasarán por el standard analyzer, ✗ No es efectivo para todos los casos
  • 10. Ejemplo: Configuración Básica (3) ● Mapeado de campos: – Cada field de un type puede ser de un tipo diferente – Los tipos por defecto de ElasticSearch son: ● String ● Integer / Long ● Float / Double ● Boolean ● Null
  • 11. ¡Pero no es suficiente!¡Necesito MÁS! ● Si el mapeado de tu entity es insuficiente: – 'nested' types: 'embeben' un subdocumento. – Ejemplo: El documento 'movie' -> subdocs 'actor' – 'object' type: Igual que 'nested', pero apoyado en relaciones de Doctrine – multi_field: ● Reemplazado por 'fields' en la 1.0 ● ¡IDEA! – integer y string pueden ser arrays de ints o strings
  • 12. Analyzers ● Ejemplos de Analyzers: – Analyzer: Token – Elasticsearch → Analyze API! – Con “Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb Analyzer Tokens Simple dr | strangelove | or | how | i | learned | to | stop | worrying | and | love | the | bomb Standard dr | strangelove | how | i | learned | stop | worrying | love | bomb English dr | strangelov | how | i | learn | stop | worri | love | bomb Spanish dr | strangelov | or | how | i | learned | to | stop | worrying | and | love | the | bomb Keyword “Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb” (1 token)
  • 14. Ejemplo: Búsqueda ● FOSElasticaBundle – Acceso a índices: 'fos_elastica.index.{index_name}.{type_name}'. ● En el ejemplo: fos_elastica.index.symfony_bcn_example. (movie|genre|director|actor) ● Queries: Hechas con Elastica.
  • 15. Consideraciones ● Elastica proporciona tipos de queries mucho más complejas – QueryString: La más potente y configurable (bastante familiar para los que vienen de Solr) ● FOSElasticaBundle: – Finder: ElasticaQuery → Entities ● Paginadores (knp_paginator, pagerfanta) – Listeners (insert, update, delete) ● No está disponible para el driver propel.
  • 16. Limitaciones: Soluciones (1) ● Evitar mapeado 1-1 con la entity: – provider (para el populate) – model_to_elastica_transformer (para los listeners). – Normalmente el mapping 1-1 no es bueno para la búsqueda ● 'Copia de BD' vs 'Datos para buscar'
  • 17. Limitaciones: Soluciones (2) ● Provider: service que implementa ProviderInterface de FOSElasticaBundle. – Queries personalizadas. Mejora de velocidad. ● model_to_elastica_transformer: Service que debe implementar ModelToElasticaTransformerInterface, – 'traducirá' nuestra entity a Document de Elastica. – (Ejemplo: ModelToElasticaAutoTransformer de FOSElasticaBundle)
  • 18. Limitaciones: Soluciones (3) ● Para no usar siempre el analyzer standard: – Definir un analyzer por field – Analyzers nativos de Elasticsearch: Standard, Simple, Whitespace, Stop, Keyword, Pattern, Language, Snowball y Custom – Custom analyzer: permite escoger nuestra combinación propia de tokenizer + token filter
  • 19. Limitaciones: Más cosas a considerar ● Si usamos el finder: – elastica_to_model_transformer: ● traduce id's de Elastica a Entities. ● Ejemplo de uso: eager loading de colecciones asociadas (caso típico: cargar traducciones)
  • 20. Búsqueda: Query vs Filters ● Al buscar, ojo con Query vs Filter. – Queries ● afectan al 'scoring' de los resultados. (Cómo de bueno es el match). ● No pueden ser cacheados – Filters ● Afectan a qué resultados se muestran. (No afecta al scoring). ● Se pueden cachear – Para acelerar búsquedas, pasemos a Filters lo que podamos.
  • 21. Búsqueda: Facets ● Típico conteo de hits por categoría ● No están afectados por los Filters, pero se les puede aplicar sus propios Filters ● OJO AL LÍO: Hay FacetFilters para los Facets. No confundir con los FilterFacets, que es crear un facet a partir de un filter ● Ejemplo: Dado un director, contar en cuántas películas de cada género ha participado.
  • 22. Percolator ● Es una especie de búsqueda inversa: – Dado un resultado, ¿qué queries satisface? ● Funcionamiento – Nombramos nuestras queries, y las registramos en el percolator – Cuando un documento haga match con una de las queries registradas, el percolator nos los dirá. ● Percolator: – “Hay un nuevo documento que cumple con la condición X”
  • 23. Show me the code! ● Podéis encontrar el código usado en esta presentación en: – https://github.com/mrzard/symfony2-elasticsearch-example ● Si pedís/tenéis una API key de tMDB - http://www.themoviedb.org/ - hay un command para cargar 250 películas con sus actores, directores y géneros. ● Cosas a probar: – Otros analyzers (o crear los tuyos propios). – Hacer el típico 'autocomplete' al buscar – Intentar sacar estadísticas con los facets adecuados – Crear vuestro propio provider y ver la diferencia en la velocidad de indexación. ● Happy coding!