Upload
symfonybcn
View
1.559
Download
5
Embed Size (px)
DESCRIPTION
Veremos cómo hacer una implementación rápida de ElasticSearch para nuestra aplicación Symfony2. Introducción rápida a ElasticSearch. Cómo interactúa FOSElasticaBundle con nuestros modelo. Cómo personalizar qué información enviamos a ES. Buenas prácticas a la hora de buscar, indexar, analizar y retornar resultados.
Citation preview
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: Elastica\Query → 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!