• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Symfony2 and ElasticSearch
 

Symfony2 and ElasticSearch

on

  • 572 views

Veremos cómo hacer una implementación rápida de ElasticSearch para nuestra aplicación Symfony2. ...

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.

Statistics

Views

Total Views
572
Views on SlideShare
568
Embed Views
4

Actions

Likes
0
Downloads
5
Comments
0

1 Embed 4

http://betabeers.com 4

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Symfony2 and ElasticSearch Symfony2 and ElasticSearch Presentation Transcript

    • 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!