Symfony2 and ElasticSearch

1,960
-1

Published on

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.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,960
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
29
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Symfony2 and ElasticSearch

  1. 1. Symfony2 y Elasticsearch Gonzalo Míguez
  2. 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. 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. 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. 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. 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.* :(
  7. 7. Ejemplo: Configuración Básica
  8. 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. 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. 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. 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. 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)
  13. 13. Ejemplo: Búsqueda
  14. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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!
  24. 24. ¡GRACIAS!
  1. ¿Le ha llamado la atención una diapositiva en particular?

    Recortar diapositivas es una manera útil de recopilar información importante para consultarla más tarde.

×