• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Aplicando elasticidad en la búsqueda con Grails
 

Aplicando elasticidad en la búsqueda con Grails

on

  • 1,448 views

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

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

Statistics

Views

Total Views
1,448
Views on SlideShare
1,444
Embed Views
4

Actions

Likes
5
Downloads
31
Comments
0

3 Embeds 4

http://www.linkedin.com 2
http://s.medcl.com 1
http://s.medcl.net 1

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

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
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • HADOOP --> software for reliable, scalable, distributed computing --> Common, HDFS, MapReduce\nMANIFOLDCF --> connecting source content repositories like Microsoft Sharepoint and EMC Documentum, to target repositories or indexes, such as Apache Solr or OpenSearchServer\nLUCY --> Porting a C\nMAHOUT --> Scalable machine learning and data mining\nNUTCH --> Verticalización para crawling web\nOPENNLP -> Procesamiento de lenguaje natural\nTIKA --> Extracción de texto de formatos tipo Office, imagen, video, xml, html, etc\nZOOKEEPER --> Servicio de configuración centralizada y registro de nombres\n
  • \n
  • \n
  • \n
  • \n
  • Los índices se descomponen en shards, donde cada shard puede tener 0 o más réplicas. Cada nodo en el cluster aloja uno o más shards, y actúa como un coordinador que delega operaciones a los shards correctos. El balanceo y el enrutado se gestionan de forma automática y entre bambalinas.\n\nEl estado del cluster (incluyendo el log de transacciones) puede ser regenerado a partir de cada nodo local (por defecto), o a partir de un repositorio compartido (como NFS o Amazon S3). Cuando se utiliza un repositorio compartido, el estado se replica de forma asíncrona.\nIncluso si se utiliza un repositorio compartido, el índice podría mantenerse completamente en memoria y al mismo tiempo hacer una recuperación completa si se produce un apagado del cluster.\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Aplicando elasticidad en la búsqueda con Grails Aplicando elasticidad en la búsqueda con Grails Presentation Transcript

  • Aplicando elasticidad ala búsqueda en Grails Enrique Medina Montenegro @emedinam
  • Índice1. Acerca del ponente2. Si buscas, encontrarás3. Elasticidad en la búsqueda4. Preguntas y respuestas5. Contacto 2
  • 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
  • Índice1. Acerca del ponente2. Si buscas, encontrarás3. Elasticidad en la búsqueda4. Preguntas y respuestas5. Contacto 4
  • 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
  • 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
  • 2. Si buscas, encontrarás
  • 2. Si buscas, encontrarás
  • 2. Si buscas, encontrarás
  • 2. Si buscas, encontrarás•Empecemos por lo que conocemos, las bases de datos (BBDD):
  • 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)
  • 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)
  • 2. Si buscas, encontrarás•Indexación por texto completo: 9
  • 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
  • 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
  • 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
  • 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
  • 2. Si buscas, encontrarás•Limitaciones a la búsqueda por texto completo: 10
  • 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
  • 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
  • 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
  • 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
  • 2. Si buscas, encontrarás•Otras BBDD que soportan texto completo:
  • 2. Si buscas, encontrarás•Otras BBDD que soportan texto completo:
  • 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.
  • 2. Si buscas, encontrarás
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 2. Si buscas, encontrarás‣ Ecosistema de proyectos relacionados:
  • 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
  • 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
  • 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
  • 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
  • 2. Si buscas, encontrarás
  • 2. Si buscas, encontrarás elasticsearch.
  • Índice1. Acerca del ponente2. Si buscas, encontrarás3. Elasticidad en la búsqueda4. Preguntas y respuestas5. Contacto 18
  • 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
  • 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
  • 3. Elasticidad en la búsqueda DEMO REST API 21
  • 3. Elasticidad en la búsqueda DEMO ES PLUGIN 22
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Analizador propio de español 23
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Analizador propio de español SpanishAnalyzer.java 23
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Analizador propio de español SpanishAnalyzer.java 23
  • 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
  • 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
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Creación del índice y mapeo del tipo ‘producto’ 24
  • 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
  • 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
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Configuración del cliente 25
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Configuración del cliente grails-app/conf/spring/resources.groovy 25
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Configuración del cliente grails-app/conf/spring/resources.groovy 25
  • 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
  • 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
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) 26
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) IndexRequestQueue.groovy 26
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) IndexRequestQueue.groovy 26
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) 26
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) 26
  • 3. Elasticidad en la búsqueda✓ Integración en la aplicación (...continua) ‣ Búsqueda avanzada 27
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • Índice1. Acerca del ponente2. Si buscas, encontrarás3. Elasticidad en la búsqueda4. Preguntas y respuestas5. Contacto 29
  • 4. P & R PREGUNTAS & RESPUESTAS 30
  • Índice1. Acerca del ponente2. Si buscas, encontrarás3. Elasticidad en la búsqueda4. Preguntas y respuestas5. Contacto 31
  • 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