Este documento presenta una introducción a Elasticsearch y cómo conectarlo con Symfony2 usando el bundle FOSElasticaBundle. Explica qué son Elasticsearch, Symfony2 y Apache Lucene, y cómo configurar Elasticsearch para indexar y buscar datos de una base de datos usando FOSElasticaBundle. También discute consideraciones como mapeo de campos, búsqueda, filtros y facetas, y soluciones para limitaciones como el mapeo 1-1 de propiedades.
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!