Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Aplicando elasticidad en la búsqueda con Grails

2,176 views

Published on

Ponencia realizada en el Spring I/O 2012 en Madrid sobre búsquedas de texto completo con Elasticsearch y Grails.

Published in: Technology
  • Be the first to comment

Aplicando elasticidad en la búsqueda con Grails

  1. 1. Aplicando elasticidad ala búsqueda en Grails Enrique Medina Montenegro @emedinam
  2. 2. Índice1. Acerca del ponente2. Si buscas, encontrarás3. Elasticidad en la búsqueda4. Preguntas y respuestas5. Contacto 2
  3. 3. 1. Acerca del ponente•Ingeniero en Informática (Univ. Alicante -1991/1996)•Fundador del y el•Socio fundador/desarrollador de•Colaborador de la comunidad “Open Source”•Más de 4 años usando Groovy/Grails•Blogger, liberal, padre, emprendedor, mac-ero 3
  4. 4. Índice1. Acerca del ponente2. Si buscas, encontrarás3. Elasticidad en la búsqueda4. Preguntas y respuestas5. Contacto 4
  5. 5. 2. Si buscas, encontrarás Búsqueda y recuperación de información“Es la ciencia de la búsqueda de información en documentos electrónicos y cualquier tipo de coleccióndocumental digital, encargada de la búsqueda dentro de éstos mismos, búsqueda de metadatos quedescriban documentos, o también la búsqueda en bases de datos relacionales, ya sea a través deinternet, intranet, y como objetivo realiza la recuperación en textos, imágenes, sonido o datos de otrascaracterísticas, de manera pertinente y relevante.” Fuente: Wikipedia 5
  6. 6. 2. Si buscas, encontrarás Búsqueda ‘full text’ (por texto completo)“En recuperación de textos/documentos, la búsqueda por texto completo se refiere a las técnicas para labúsqueda de documentos simples o colecciones de ellos en un almacenamiento computerizado a partir deunidades gramaticales simples. Se distingue de otras búsquedas porque examina todas y cada una de laspalabras almacenadas en un documento para, posteriormente, examinar si coinciden con un determinadocriterio de búsqueda.” Fuente: Wikipedia 6
  7. 7. 2. Si buscas, encontrarás
  8. 8. 2. Si buscas, encontrarás
  9. 9. 2. Si buscas, encontrarás
  10. 10. 2. Si buscas, encontrarás•Empecemos por lo que conocemos, las bases de datos (BBDD):
  11. 11. 2. Si buscas, encontrarás•Empecemos por lo que conocemos, las bases de datos (BBDD): ‣ Indexación tradicional CREATE INDEX idx_nombre ON cliente (nombre)
  12. 12. 2. Si buscas, encontrarás•Empecemos por lo que conocemos, las bases de datos (BBDD): ‣ Indexación tradicional CREATE INDEX idx_nombre ON cliente (nombre) ‣ Indexación de texto completo CREATE FULLTEXT INDEX idx_desc ON producto (descripcion)
  13. 13. 2. Si buscas, encontrarás•Indexación por texto completo: 9
  14. 14. 2. Si buscas, encontrarás•Indexación por texto completo: ‣ Funciones de búsqueda de texto completo MATCH (col1,col2,...) AGAINST (expr [IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION]) 9
  15. 15. 2. Si buscas, encontrarás•Indexación por texto completo: ‣ Funciones de búsqueda de texto completo MATCH (col1,col2,...) AGAINST (expr [IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION]) ★ Búsquedas en lenguaje natural MATCH (titulo, cuerpo) AGAINST (‘tutorial’ IN NATURAL LANGUAGE MODE) 9
  16. 16. 2. Si buscas, encontrarás•Indexación por texto completo: ‣ Funciones de búsqueda de texto completo MATCH (col1,col2,...) AGAINST (expr [IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION]) ★ Búsquedas en lenguaje natural MATCH (titulo, cuerpo) AGAINST (‘tutorial’ IN NATURAL LANGUAGE MODE) ★ Búsquedas booleanas de texto completo MATCH (titulo, cuerpo) AGAINST (‘+Grails -Ruby’ IN BOOLEAN MODE) 9
  17. 17. 2. Si buscas, encontrarás•Indexación por texto completo: ‣ Funciones de búsqueda de texto completo MATCH (col1,col2,...) AGAINST (expr [IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION]) ★ Búsquedas en lenguaje natural MATCH (titulo, cuerpo) AGAINST (‘tutorial’ IN NATURAL LANGUAGE MODE) ★ Búsquedas booleanas de texto completo MATCH (titulo, cuerpo) AGAINST (‘+Grails -Ruby’ IN BOOLEAN MODE) ★ Búsquedas con expansión de consulta MATCH (titulo, cuerpo) AGAINST (‘database’) MATCH (titulo, cuerpo) AGAINST (‘database’ WITH QUERY EXPANSION) 9
  18. 18. 2. Si buscas, encontrarás•Limitaciones a la búsqueda por texto completo: 10
  19. 19. 2. Si buscas, encontrarás•Limitaciones a la búsqueda por texto completo: ‣ Stopwords (5.1+) a, ante, bajo, cabe, con, contra, de, desde, en, entre, hacia, hasta, ... 10
  20. 20. 2. Si buscas, encontrarás•Limitaciones a la búsqueda por texto completo: ‣ Stopwords (5.1+) a, ante, bajo, cabe, con, contra, de, desde, en, entre, hacia, hasta, ... ‣ Sólo tipos CHAR, VARCHAR, TEXT 10
  21. 21. 2. Si buscas, encontrarás•Limitaciones a la búsqueda por texto completo: ‣ Stopwords (5.1+) a, ante, bajo, cabe, con, contra, de, desde, en, entre, hacia, hasta, ... ‣ Sólo tipos CHAR, VARCHAR, TEXT ‣ No existen analizadores que permitan definir: ★ Tokenizadores (división en palabras) ★ Filtros (mayúsculas/minúsculas, conversores ASCII, supresión de etiquetas HTML, etc.) ★ Stemmers (raíz derivativa de una palabra) 10
  22. 22. 2. Si buscas, encontrarás•Limitaciones a la búsqueda por texto completo: ‣ Stopwords (5.1+) a, ante, bajo, cabe, con, contra, de, desde, en, entre, hacia, hasta, ... ‣ Sólo tipos CHAR, VARCHAR, TEXT ‣ No existen analizadores que permitan definir: ★ Tokenizadores (división en palabras) ★ Filtros (mayúsculas/minúsculas, conversores ASCII, supresión de etiquetas HTML, etc.) ★ Stemmers (raíz derivativa de una palabra) ‣ Consultas complejas (faceted, fuzzy, span, score) 10
  23. 23. 2. Si buscas, encontrarás•Otras BBDD que soportan texto completo:
  24. 24. 2. Si buscas, encontrarás•Otras BBDD que soportan texto completo:
  25. 25. 2. Si buscas, encontrarás•¿Y si sacamos la búsqueda fuera de la BBDD?: Apache Lucene(TM) es una librería que implementa un motor de búsqueda de texto completo de alto rendimiento y que ha sido escrita enteramente en Java. Se trata, pues, de una tecnología apropiada para casi cualquier aplicación que requiera de búsquedas de texto completo, independientemente de cuál sea su plataforma.
  26. 26. 2. Si buscas, encontrarás
  27. 27. 2. Si buscas, encontrarás ‣ Indexación escalable, de alto rendimiento ✓ Hasta 95GB/hora con hardware de última generación ✓ Requisitos de RAM mínimos -- tan sólo 1MB (pila) ✓ Indexación incremental tan rápida como indexación por lotes ✓ Tamaño del índice approx. 20-30% del tamaño real del texto indexado
  28. 28. 2. Si buscas, encontrarás‣ Indexación escalable, de alto rendimiento ✓ Hasta 95GB/hora con hardware de última generación ✓ Requisitos de RAM mínimos -- tan sólo 1MB (pila) ✓ Indexación incremental tan rápida como indexación por lotes ✓ Tamaño del índice approx. 20-30% del tamaño real del texto indexado
  29. 29. 2. Si buscas, encontrarás‣ Indexación escalable, de alto rendimiento ✓ Hasta 95GB/hora con hardware de última generación ✓ Requisitos de RAM mínimos -- tan sólo 1MB (pila) ✓ Indexación incremental tan rápida como indexación por lotes ✓ Tamaño del índice approx. 20-30% del tamaño real del texto indexado‣ Algoritmos de búsqueda potentes, precisos y eficientes ✓ Búsquedas por puntuación -- los mejores resultados se devuelven los primeros ✓ Todo tipo de consultas: por frase, con comodines, por proximidad, por rango, etc. ✓ Búsquedas por campos, con ordenación por cualquier campo ✓ Búsquedas por múltiple índice combinadas ✓ Permite indexación y búsqueda simultánea
  30. 30. 2. Si buscas, encontrarás‣ Indexación escalable, de alto rendimiento ✓ Hasta 95GB/hora con hardware de última generación ✓ Requisitos de RAM mínimos -- tan sólo 1MB (pila) ✓ Indexación incremental tan rápida como indexación por lotes ✓ Tamaño del índice approx. 20-30% del tamaño real del texto indexado ‣ Algoritmos de búsqueda potentes, precisos y eficientes ✓ Búsquedas por puntuación -- los mejores resultados se devuelven los primeros ✓ Todo tipo de consultas: por frase, con comodines, por proximidad, por rango, etc. ✓ Búsquedas por campos, con ordenación por cualquier campo ✓ Búsquedas por múltiple índice combinadas ✓ Permite indexación y búsqueda simultánea
  31. 31. 2. Si buscas, encontrarás‣ Indexación escalable, de alto rendimiento ✓ Hasta 95GB/hora con hardware de última generación ✓ Requisitos de RAM mínimos -- tan sólo 1MB (pila) ✓ Indexación incremental tan rápida como indexación por lotes ✓ Tamaño del índice approx. 20-30% del tamaño real del texto indexado‣ SoporteAlgoritmos de búsqueda potentes, precisos y eficientes ‣ multi-plataforma ✓ Búsquedas por puntuación -- los mejores resultados se devuelven los primeros ✓ Disponible como software Open frase, con bajo licencia de Apache ✓ Todo tipo de consultas: por Source comodines, por proximidad, por rango, etc. ✓ ✓ puro 100% Java Búsquedas por campos, con ordenación por cualquier campo ✓ Búsquedas por múltiple índice combinadas ✓ Implementaciones en otros lenguajes con compatibilidad de índices ✓ Permite indexación y búsqueda simultánea
  32. 32. 2. Si buscas, encontrarás‣ Indexación escalable, de alto rendimiento ✓ Hasta 95GB/hora con hardware de última generación ✓ Requisitos de RAM mínimos -- tan sólo 1MB (pila) ✓ Indexación incremental tan rápida como indexación por lotes ✓ Tamaño del índice approx. 20-30% del tamaño real del texto indexado ‣ Algoritmos de búsqueda potentes, precisos y eficientes ✓ Búsquedas por puntuación -- los mejores resultados se devuelven los primeros ✓ Todo tipo de consultas: por frase, con comodines, por proximidad, por rango, etc. ✓ Búsquedas por campos, con ordenación por cualquier campo ✓ Búsquedas por múltiple índice combinadas ✓ Permite indexación y búsqueda simultánea ‣ Soporte multi-plataforma ✓ Disponible como software Open Source bajo licencia de Apache ✓ 100% Java puro ✓ Implementaciones en otros lenguajes con compatibilidad de índices
  33. 33. 2. Si buscas, encontrarás‣ Ecosistema de proyectos relacionados:
  34. 34. 2. Si buscas, encontrarás‣ Ecosistema de proyectos relacionados: ✓ Apache Hadoop ✓ Apache Solr ✓ Apache ManifoldCF ✓ Apache Lucene.NET ✓ Apache Lucy ✓ Apache Mahout ✓ Apache Nutch ✓ Apache OpenNLP ✓ Apache Tika ✓ Apache Zookeeper
  35. 35. 2. Si buscas, encontrarás‣ Simplificación en la búsqueda sobre Lucene: ✴ API de Lucene complicada - Muy bajo nivel ✴ Proporciona un mapeador OR fácil de usar ✴ Distintos formatos: Object, XML, JSON, Resource ✴ Capa transaccional con integración JTA/XA ✴ Utiliza Spring e incorpora TX, MVC y AOP ✴ Soporta índices distribuidos: BBDD / Data Grid
  36. 36. 2. Si buscas, encontrarás‣ Simplificación en la búsqueda sobre Lucene: ✴ API de Lucene complicada - Muy bajo nivel ✴ Proporciona un mapeador OR fácil de usar ✴ Distintos formatos: Object, XML, JSON, Resource ✴ Capa transaccional con integración JTA/XA ✴ Utiliza Spring e incorpora TX, MVC y AOP ✴ Soporta índices distribuidos: BBDD / Data Grid
  37. 37. 2. Si buscas, encontrarás ‣ Pero, ¿cómo mejorar si cabe más Compass?: ✴ Solución mucho más escalable / distribuida ✴ Características de búsqueda simplificadas: ➡ Facets (multifacética): estadísticas, etc. ➡ Difusa / “Como ésta” ➡ Puntuación personalizada/derivada ➡ Filtros: geodistancia, rangos, etc. ✴ JSON sobre HTTP, RESTful, Groovy
  38. 38. 2. Si buscas, encontrarás
  39. 39. 2. Si buscas, encontrarás elasticsearch.
  40. 40. Índice1. Acerca del ponente2. Si buscas, encontrarás3. Elasticidad en la búsqueda4. Preguntas y respuestas5. Contacto 18
  41. 41. 3. Elasticidad en la búsqueda ‣ Ya sabes, para Buscar: ★ Open Source (Apache 2) ★ Motor distribuido, RESTful, sobre Lucene ‣ Libre de esquema & Orientado a Documento: ★ Modelo NoSQL basado en JSON ‣ Búsqueda: ★ DSL basado en JSON: queries, facets, highlighting, scripting, percolator, geobúsquedas, etc. ★ Multi-tenancy: búsqueda por múltiples índices ‣ Distribuido: ★ Índices --> fragmentos (shards) --> réplicas ★ Cluster --> nodos --> 1..n fragmentos ★ Balanceo, enrutado, tolerancia a fallos (Gateway), etc. 19
  42. 42. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación ‣ Mediante plugin: ★ “As for now, you should only use this plugin for testing purpose since you may lack some functionalities in a production environment” ‣ Directamente con la API de elasticsearch: ★ REST API --> Expuesta mediante HTTP, thrift, memcached ★ Java API --> Asíncrona, soporta 100% la REST API ★ Groovy API --> Asíncrona, envoltorio limitado sobre la Java API ‣ Clientes: ★ Node --> Se une al cluster como un nodo más y puede almacenar información o no, incluso configurarse como cluster local ★ Transport --> No se une al cluster; conexión remota 20
  43. 43. 3. Elasticidad en la búsqueda DEMO REST API 21
  44. 44. 3. Elasticidad en la búsqueda DEMO ES PLUGIN 22
  45. 45. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Analizador propio de español 23
  46. 46. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Analizador propio de español SpanishAnalyzer.java 23
  47. 47. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Analizador propio de español SpanishAnalyzer.java 23
  48. 48. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Analizador propio de español SpanishAnalyzer.java elasticsearch/config/elasticsearch.yml 23
  49. 49. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Analizador propio de español SpanishAnalyzer.java elasticsearch/config/elasticsearch.yml 23
  50. 50. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Creación del índice y mapeo del tipo ‘producto’ 24
  51. 51. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Creación del índice y mapeo del tipo ‘producto’ $ curl -XPUT http://localhost:9200/cuestamenos/ -d {     settings : {         index : {             number_of_shards : 3,             number_of_replicas : 2         }     } } 24
  52. 52. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Creación del índice y mapeo del tipo ‘producto’ $ curl -XPUT http://localhost:9200/cuestamenos/producto/mapping -d 24
  53. 53. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Configuración del cliente 25
  54. 54. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Configuración del cliente grails-app/conf/spring/resources.groovy 25
  55. 55. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Configuración del cliente grails-app/conf/spring/resources.groovy 25
  56. 56. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Configuración del cliente TransportClientFactoryBean.groovy grails-app/conf/spring/resources.groovy 25
  57. 57. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Configuración del cliente grails-app/conf/spring/resources.groovy TransportClientFactoryBean.groovy 25
  58. 58. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) 26
  59. 59. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) IndexRequestQueue.groovy 26
  60. 60. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) IndexRequestQueue.groovy 26
  61. 61. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) 26
  62. 62. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) 26
  63. 63. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Búsqueda avanzada 27
  64. 64. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua){ ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } }} 27
  65. 65. 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) { ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } } } 27
  66. 66. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua){ ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { ElasticSearchUtil.groovy "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } }} 27
  67. 67. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua){ ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { ElasticSearchUtil.groovy "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } }} 27
  68. 68. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua){ ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { ElasticSearchUtil.groovy "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } }} 27
  69. 69. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua){ ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { ElasticSearchUtil.groovy "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } }} 27
  70. 70. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua){ ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { ElasticSearchUtil.groovy "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } }} 27
  71. 71. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua){ ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { ElasticSearchUtil.groovy "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } }} 27
  72. 72. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua){ ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { ElasticSearchUtil.groovy "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } }} 27
  73. 73. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua){ ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], ElasticSearchUtil.groovy “query” : { "filtered" : { "query" : { "bool" : { "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } }} 27
  74. 74. 3. Elasticidad en la búsqueda✓ En resumen... ‣ Añadir búsqueda de texto completo a tu aplicación es un juego de niños con ElasticSearch ‣ Configuración sin dolores de cabeza (para comenzar a trabajar) ‣ Funcionalidad compleja a tu alcance (facets, highlighting, percolator, etc.) con JSON simple sobre HTTP ‣ ES no es un repositorio NoSQL, aunque se parece (orientado a documentos sin esquema predeterminado) ‣ Distribuido, disponible, escalable, tiempo real, para la nube 28
  75. 75. Índice1. Acerca del ponente2. Si buscas, encontrarás3. Elasticidad en la búsqueda4. Preguntas y respuestas5. Contacto 29
  76. 76. 4. P & R PREGUNTAS & RESPUESTAS 30
  77. 77. Índice1. Acerca del ponente2. Si buscas, encontrarás3. Elasticidad en la búsqueda4. Preguntas y respuestas5. Contacto 31
  78. 78. 5. Contacto E-mail: e.medina.m@gmail.com Twitter: @emedinam @observadegrails @cuestamenos http://observatoriodegrails.com http://forodegrails.com http://cuestamenos.com GRACIAS POR VUESTRA ATENCIÓN 32

×