2. Índice
1. Acerca del ponente
2. Si buscas, encontrarás
3. Elasticidad en la búsqueda
4. Preguntas y respuestas
5. Contacto
2
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. Índice
1. Acerca del ponente
2. Si buscas, encontrarás
3. Elasticidad en la búsqueda
4. Preguntas y respuestas
5. Contacto
4
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ón
documental digital, encargada de la búsqueda dentro de éstos mismos, búsqueda de metadatos que
describan documentos, o también la búsqueda en bases de datos relacionales, ya sea a través de
internet, intranet, y como objetivo realiza la recuperación en textos, imágenes, sonido o datos de otras
características, de manera pertinente y relevante.”
Fuente: Wikipedia
5
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 la
búsqueda de documentos simples o colecciones de ellos en un almacenamiento computerizado a partir de
unidades gramaticales simples. Se distingue de otras búsquedas porque examina todas y cada una de las
palabras almacenadas en un documento para, posteriormente, examinar si coinciden con un determinado
criterio de búsqueda.”
Fuente: Wikipedia
6
10. 2. Si buscas, encontrarás
•Empecemos por lo que conocemos, las bases de
datos (BBDD):
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. 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. 2. Si buscas, encontrarás
•Indexación por texto completo:
9
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. 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. 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. 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. 2. Si buscas, encontrarás
•Limitaciones a la búsqueda por texto completo:
10
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. 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. 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. 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. 2. Si buscas, encontrarás
•Otras BBDD que soportan texto completo:
24. 2. Si buscas, encontrarás
•Otras BBDD que soportan texto completo:
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.
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. 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. 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. 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. 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. 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. 2. Si buscas, encontrarás
‣ Ecosistema de proyectos relacionados:
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. 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. 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
40. Índice
1. Acerca del ponente
2. Si buscas, encontrarás
3. Elasticidad en la búsqueda
4. Preguntas y respuestas
5. Contacto
18
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. 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
45. 3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
‣ Analizador propio de español
23
46. 3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
‣ Analizador propio de español
SpanishAnalyzer.java
23
47. 3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
‣ Analizador propio de español
SpanishAnalyzer.java
23
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. 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. 3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
‣ Creación del índice y mapeo del tipo ‘producto’
24
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. 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. 3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
‣ Configuración del cliente
25
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. 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. 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. 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. 3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
‣ Indexación por lotes (bulk indexing)
26
59. 3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
‣ Indexación por lotes (bulk indexing)
IndexRequestQueue.groovy
26
60. 3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
‣ Indexación por lotes (bulk indexing)
IndexRequestQueue.groovy
26
61. 3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
‣ Indexación por lotes (bulk indexing)
26
62. 3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
‣ Indexación por lotes (bulk indexing)
26
63. 3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
‣ Búsqueda avanzada
27
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. Índice
1. Acerca del ponente
2. Si buscas, encontrarás
3. Elasticidad en la búsqueda
4. Preguntas y respuestas
5. Contacto
29
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