symfony2 and elasticsearch

24
Symfony2 y Elasticsearch Gonzalo Míguez

Upload: symfonybcn

Post on 20-Jun-2015

1.559 views

Category:

Technology


5 download

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.

TRANSCRIPT

Page 1: Symfony2 and ElasticSearch

Symfony2 y Elasticsearch

Gonzalo Míguez

Page 2: Symfony2 and ElasticSearch

¡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.

Page 3: Symfony2 and ElasticSearch

¿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.

Page 4: Symfony2 and ElasticSearch

¿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

Page 5: Symfony2 and ElasticSearch

¿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

Page 6: Symfony2 and ElasticSearch

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.* :(

Page 7: Symfony2 and ElasticSearch

Ejemplo: Configuración Básica

Page 8: Symfony2 and ElasticSearch

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.

Page 9: Symfony2 and ElasticSearch

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

Page 10: Symfony2 and ElasticSearch

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

Page 11: Symfony2 and ElasticSearch

¡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

Page 12: Symfony2 and ElasticSearch

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)

Page 13: Symfony2 and ElasticSearch

Ejemplo: Búsqueda

Page 14: Symfony2 and ElasticSearch

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.

Page 15: Symfony2 and ElasticSearch

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.

Page 16: Symfony2 and ElasticSearch

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'

Page 17: Symfony2 and ElasticSearch

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)

Page 18: Symfony2 and ElasticSearch

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

Page 19: Symfony2 and ElasticSearch

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)

Page 20: Symfony2 and ElasticSearch

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.

Page 21: Symfony2 and ElasticSearch

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.

Page 22: Symfony2 and ElasticSearch

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”

Page 23: Symfony2 and ElasticSearch

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!

Page 24: Symfony2 and ElasticSearch

¡GRACIAS!