Elasticsearch

Si necesitas hacer una búsqueda de texto completo, probablemente elijas Apache Solr y, en efecto, será una buena elección, pero desde 2010 el mercado ofrece una alternativa interesante: Elasticsearch. Al igual que Solr, Elasticsearch está basado en Apache Lucene, pero cuenta con otras funciones muy interesantes. Te explicamos las características del servidor de búsqueda y cómo implementar la búsqueda de texto completo para tu proyecto con nuestro tutorial de Elasticsearch.

Elasticsearch es uno de los buscadores de texto completo más importantes de Internet. Grandes empresas como, por ejemplo, Facebook, GitHub, Netflix, SoundCloud o Zalando llevan años trabajando con el software con mucho éxito.

¿Qué es Elasticsearch?

Dada la gran cantidad de información con la que cuentan algunos sitios web, solo se puede garantizar un alto nivel de funcionalidad implementando una búsqueda de texto completo. Si no quieres recurrir a las herramientas de Google o Bing para ofrecer a tus visitantes una función de búsqueda, tendrás que insertar la tuya propia. Esto es posible, por ejemplo, con Elasticsearch. Este software libre se basa en la versión gratuita de Apache Lucene.

Elasticsearch ofrece las ventajas de sus predecesores e incluye otras características. Como en el caso de Lucene, la búsqueda se realiza mediante un índice, pero en lugar de examinar todos los documentos, el programa comprueba un índice de documentos que se ha creado previamente en el que todo el contenido se almacena de forma preparada. Este proceso requiere mucho menos tiempo que la consulta de todos los documentos.

Aunque Lucene ofrece total libertad en cuanto a dónde y cómo utilizar la búsqueda de texto completo, con este software se parte de cero. A cambio, Elasticsearch facilita los primeros pasos en la Web. Con Elasticsearch es posible construir un servidor de búsqueda estable en poco tiempo que también se puede distribuir fácilmente entre varios equipos.

Utilizando el llamado sharding, varios nodos (diferentes servidores) se unen para formar un clúster: Elasticsearch desglosa el índice y distribuye las partes individuales (shards) entre varios nodos, dividiendo así la carga de cálculo. Para proyectos grandes, la búsqueda de texto completo es mucho más estable y, en caso de que busques mayor seguridad, también puedes copiar los fragmentos a varios nodos.

Elaticsearch se basa, al igual que Lucene, en el lenguaje de programación orientado a objetos Java. El motor de búsqueda produce los resultados en formato JSON y los entrega a través de un servicio web REST. La API facilita la integración de la función de búsqueda en un sitio web.

Además, Elasticsearch ofrece con Kibana, Beats y Logstash (conocidos juntos como Elastic-Stack) servicios adicionales que se pueden utilizar para analizar la búsqueda de texto completo. La empresa Elastic, que está detrás del desarrollo de Elasticsearch y que fue fundada por el inventor del programa, también ofrece servicios de pago, como el cloud hosting.

¿Qué ofrece Elasticsearch que no tengan los grandes motores de búsqueda?

Si Google te permite integrar su popular función de búsqueda en tu página web sin ningún problema, ¿por qué motivo deberías decidirte por una opción más tediosa que te exige desarrollar tu propio motor de búsqueda con Elasticsearch? Con la Búsqueda Personalizada de Google (GCS) dependes del gigante de los motores de búsqueda y has de resignarte, al menos en la versión gratuita, a la publicidad en los resultados. Esto puedes evitarlo con Elasticsearch, porque el código es open source, lo que significa que, una vez has implementado la función de búsqueda de texto completo, ya no le pertenece a nadie más que a ti.

Además, Elasticsearch puede personalizarse por completo. Si, por ejemplo, operas tu propia plataforma o una tienda online, puedes configurar la función de búsqueda para que también puedan explorarse los perfiles registrados. GCS, no obstante, llega al límite de sus capacidades en estos ámbitos de aplicación.

Elasticsearch vs. Apache Solr: ¿cuáles son las principales diferencias?

Tanto Elasticsearch como Apache Solr están basados en Lucene, pero han sido desarrollados para proporcionar ofertas independientes. Muchos usuarios se preguntan qué proyecto les vendría mejor. Aunque Elasticsearch es un poco más joven y no cuenta con el respaldo de la experimentada comunidad de Apache, ha superado a Solr en número de usuarios. El principal motivo es que su implementación es mucho más sencilla. Además, Elasticsearch es popular por su manejo de datos dinámicos: gracias a un procedimiento especial de almacenamiento en caché, Elasticsearch hace posible que los cambios no tengan que ser introducidos en la caché global. En su lugar, es suficiente con cambiar un pequeño segmento, lo que hace a Elasticsearch mucho más flexible.

Sin embargo, con frecuencia la elección de uno u otro software dependerá del enfoque que se dé al desarrollo del código abierto. Solr está totalmente comprometido con la Apache Software Foundation: community over code. Esto supone que cada contribución al código se valora seriamente y la comunidad en conjunto decide qué complementos y mejoras se incluirán en el código final. El desarrollo de Elasticsearch es diferente. Si bien también es un proyecto de código abierto que se ofrece bajo una licencia libre de Apache, en este caso solo el equipo de Elastic decide qué cambios se hacen en el código. Contra esta mentalidad gatekeeper algunos desarrolladores se revelan y, en consecuencia, optan por Solr.

Tutorial de Elasticsearch

Si empiezas a trabajar con Elasticsearch, lo primero que debes hacer es conocer algunos términos básicos. Empecemos por mencionar la estructura de la información en el programa:

  • Index: una búsqueda en Elasticsearch nunca arroja el contenido como respuesta, sino el índice, en el cual se almacenan, ya preparados, todos los contenidos de todos los documentos. De esta forma la búsqueda requiere muy poco tiempo. Es el llamado inverted index (índice invertido): para cada término de búsqueda se indica el lugar donde se puede encontrar dicho término.
  • Document: la salida para el índice son los documentos, en los cuales aparecen los datos. No tienen que ser necesariamente textos completos (por ejemplo, artículos de blogs) –es suficiente que se trate de archivos con información.
  • Field: un documento, a su vez, consta de varios campos. Además del campo de contenido propiamente dicho, hay otros metadatos que también forman parte de un documento. Por ejemplo, Elasticsearch puede utilizarse para buscar metadatos sobre el autor o el momento de la creación.

Por cierto, cuando hablamos de la preparación de datos, estamos haciendo referencia a convertirlos en tokens, acción conocida por su nombre en inglés tokenizing. En este proceso, un algoritmo crea términos individuales a partir de un texto completo. Para el ordenador no existen las palabras, sino que para él un texto consiste en una larga cadena de caracteres y una letra tiene el mismo valor que un espacio. Para que un texto sea formateado con sentido, primero debe ser dividido en tokens. Para ello se toma el espacio en blanco (whitespace, es decir, espacios y líneas en blanco) como marcador para palabras. Durante la preparación, también se normaliza: todas las palabras se escriben en minúsculas y los signos de puntuación se ignoran. Elasticsearch ha adoptado todos estos métodos de Apache Lucene.

Nota

En el siguiente tutorial de Elasticsearch trabajamos con la versión 6.3.0. Si estás usando una versión diferente, puede que algunos ejemplos de código o los pasos del tutorial deban llevarse a cabo de forma diferente

Instalación

Los archivos necesarios para Elasticsearch están disponibles gratuitamente en el sitio web oficial de Elastic como paquetes ZIP o tar.gz, por lo que son fáciles de instalar en Linux y Mac a través de una consola.

Nota

Elastic ofrece Elasticsearch en dos paquetes diferentes. La versión estándar incluye funciones de pago que puedes usar durante un tiempo determinado gracias a una versión de prueba. Estos paquetes, que están marcados con OSS (Open Source Software), solo contienen componentes libres que han sido publicados bajo la licencia Apache 2.0.

Para ZIP:

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-oss-6.3.0.zip
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-oss-6.3.0.zip.sha512
shasum -a 512 -c elasticsearch-oss-6.3.0.zip.sha512 
unzip elasticsearch-oss-6.3.0.zip
cd elasticsearch-6.3.0

Para tar.gz:

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-oss-6.3.0.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-oss-6.3.0.tar.gz.sha512
shasum -a 512 -c elasticsearch-oss-6.3.0.tar.gz.sha512 
tar -xzf elasticsearch-oss-6.3.0.tar.gz
cd elasticsearch-6.3.0

En primer lugar, descarga el paquete y luego la suma de verificación hash (SHA512), que podrás comprobar en el tercer paso. A continuación, descomprime el paquete y cámbialo a la carpeta correspondiente.

El archivo ZIP se puede descargar también para utilizarlo con Windows, ya que el paquete contiene un archivo batch que puedes ejecutar. Ahora, Elastic proporciona también un instalador MSI, aunque aún se encuentra en fase beta. Este proporciona un archivo de instalación cuya interfaz gráfica te guiará durante todo el proceso.  

Nota

Dado que Elasticsearch está basado en Java, tu sistema debe tener instalado este lenguaje de programación. Lo mejor es descargar gratis el Java Development Kit (JDK) desde la página web oficial.

A continuación, ejecuta Elasticsearch desde la consola, dirígete a la carpeta bin e introduce “elasticsearch”, ya sea en Linux, Mac o Windows. A continuación, abre un navegador y accede al siguiente puerto del host local: 'http://localhost:9200/'. Si has instalado Elasticsearch correctamente y Java también está bien configurado, deberías poder acceder a la búsqueda de texto completo.

Con Elasticsearch te comunicas a través de la API REST, por lo que necesitas un cliente adicional. Se recomienda usar Kibana (que es otro software de código abierto de Elastic). Con este programa puedes utilizar Elasticsearch directamente en tu navegador. Para ello, basta con ir a "http://localhost:5601/" y acceder a una interfaz gráfica de usuario. Cómo instalar y configurar Kibana correctamente se explica en nuestro tutorial para Kibana. En Kibana y en cualquier otro cliente puedes utilizar los métodos HTTP PUT, GET, POST y DELETE para enviar comandos a tu búsqueda de texto completo.

Indexar

El siguiente paso consiste en crear un índice e introducir los datos. Para ello, puedes utilizar dos métodos HTTP diferentes: POST y PUT. Utiliza PUT si deseas especificar un ID determinado para la entrada. En POST, Elasticsearch crea su ID propio. En nuestro ejemplo queremos hacer una bibliografía, de forma que cada entrada debe contener el nombre del autor, el título de la obra y el año de publicación.

POST bibliography/novels
{
"author": "Isabel Allende",
"title": "La casa de los espíritus",
"year": "1982"
}

Si deseas utilizar la entrada de esta manera, tienes que usar la consola de Kibana. Sin embargo, si no quieres usar este software, tienes la opción de recurrir a cURL. En lugar del comando anterior, debes introducir lo siguiente en la línea de comandos:

curl -XPOST http://localhost:9200/bibliography/novels -H "Content-Type: application/json" -d '{"author": "Isabel Allende", "title": "La casa de los espíritus", "year": "1982"}'

A continuación, te mostramos solo el código para Kibana, pero puedes adaptarlo fácilmente a la sintaxis de cURL.

Si has introducido todo correctamente, Elasticsearch debería ofrecer la siguiente información al principio del mensaje:

{
	"_index": "bibliography",
	"_type": "novels",
	"_id": "AKKKIWQBZat9Vd0ET6N1",
	"_version": 1,
	"result": "created",
}

Como se ve aquí, Elasticsearch encuentra un índice con el nombre bibliografía y el tipo novela. Como hemos usado el método POST, Elasticsearch generó automáticamente un ID único para nuestra entrada. La entrada se encuentra ahora en la primera versión y se ha creado recientemente (created).

Nota

Un tipo (_type) solía ser una especie de subcategoría en Elasticsearch. A través de esta subcategoría, era posible reunir varios tipos bajo un mismo índice. No obstante, debido a los problemas de diversa índole a los que esto condujo, Elastic está planeando dejar de utilizar estos tipos. En la versión 6.x, _type sigue estando incluido, pero ya no es posible reunir varios tipos bajo un mismo índice. A partir de la versión 7.0 está previsto eliminar todos los tipos, como explican los desarrolladores en su blog.

También puedes utilizar PUT para dar a tu entrada un ID específico que debes definir en la primera línea del código. También necesitas PUT si deseas modificar una entrada existente.

PUT bibliography/novels/1
{
"author": "William Gibson",
"title": "Neuromancer",
"year": "1984"
}

La siguiente salida es muy similar a la que obtenemos con el método POST, pero, en este caso, Elasticsearch nos da el ID que le dimos a la entrada en la primera línea. El orden de la información es siempre _index/_type/_id.

{
	"_index": "bibliography",
	"_type": "novels",
	"_id": "1",
	"_version": 1,
	"result": "created",
}

Con el comando PUT y el ID único también podemos cambiar las entradas:

PUT bibliography/novels/1
{
"author": "William Gibson",
"title": "Count Zero",
"year": "1986"
}

Como la entrada con el ID 1 ya existe, Elasticsearch solo la modifica, en lugar de crear una nueva. Esto también se refleja en el resultado:

{
	"_index": "bibliography",
	"_type": "novels",
	"_id": "1",
	"_version": 2,
	"result": "updated",
}

El número de la versión es ahora el 2 y como result se obtiene un updated, en lugar de un created. Puedes hacer lo mismo con un ID aleatorio creado por Elasticsearch pero, debido a la longitud y al desorden de los caracteres, el trabajo posterior sería mucho más engorroso. En consecuencia, si te equivocas al introducir los números de identificación puede ocurrir que Elasticsearch sobrescriba una entrada. Para evitar sobrescrituras accidentales, puedes emplear _create al final de la línea:

PUT bibliography/novels/1/_create
{
"author": "Mary Shelley",
"title": "Frankenstein; or, The Modern Prometheus",
"year": "1818"
}

Al existir ya una entrada con el ID 1 en el índice, aparece un mensaje de error.

Si se realizan modificaciones en una entrada tal y como se ha descrito hasta ahora, se crea una entrada totalmente nueva y, por lo tanto, se deben introducir todos los datos por completo. No obstante, también puedes integrar modificaciones en la entrada existente, utilizando para ello el parámetro _update:

POST bibliography/novels/1/_update
{
"doc": {
	"author": "Franz Kafka",
"genre": "Horror"
	}
}

Lo que hemos hecho aquí arriba es añadir un campo adicional a la entrada y hemos cambiado un campo existente sin borrar los otros, pero solo en primer plano. En un segundo plano Elasticsearch ha creado una entrada nueva haciéndose cargo de la incorporación de los contenidos que ya existían.

Hasta aquí hemos escrito una entrada en una base de datos que podemos recuperar en cualquier momento. Utilizamos para ello el método GET.

GET bibliography/novels/1

Si quieres, tienes la opción de visualizar la entrada en tu navegador:

http://localhost:9200/bibliography/novels/1

En el output, Elasticsearch nos muestra todos los detalles de nuestra entrada:

{
	"_index": "bibliography",
	"_type": "novels",
	"_id": "1",
	"_version": 2,
	"found": true,
	"_source": {
		"author": "William Gibson",
		"title": “Count Zero",
		"year": "1984"
	}
}

Sin perjuicio de lo previsto anteriormente, también podrás encontrar los campos del documento en _source. Elasticsearch también informa de que se ha encontrado una entrada. Si intentas llamar una entrada inexistente, no aparecerá un mensaje de error. En su lugar Elasticsearch responderá “found”: false, lo que quiere decir que no hay entradas en _source.

También tienes la opción de extraer solo cierta información de la base de datos. Supongamos que no solo has incluido datos bibliográficos en tu índice, sino también el texto completo de cada novela grabada. Esta información se mostraría con una simple petición GET. Supongamos, sin embargo, que por el momento solo te interesa el nombre del autor y el título de la obra, entonces puedes pedirlo específicamente:

GET bibliography/novels/1?_source=author,title

Si no estás interesado en los metadatos de una entrada, también puede mostrar solo el contenido:

GET bibliography/novels/1/_source

Para los casos en los que no deseas llamar una sola entrada en el índice, sino varias, Elasticsearch ha implementado el parámetro _mget (para multi-get). Si utilizas esta opción, especifica una matriz compuesta de varios ID:

GET bibliography/novels/_mget
{
	"ids": ["1", "2", "3"]
}

Incluso si una entrada no existe todavía, la solicitud completa no falla, sino que se te mostrarán todos los datos existentes. En cuanto a los datos que faltan, Elasticsearch responde que no ha podido encontrarlos.

El borrado de una entrada funciona de forma similar a su llamada. En lugar de utilizar GET, sin embargo, se trabaja con DELETE:

DELETE /bibliography/novels/1

En el siguiente mensaje Elasticsearch te informa de que ha encontrado la entrada bajo el ID especificado:

{
	"_index": "bibliography",
	"_type": "novels",
	"_id": "1",
	"_version": 5,
	"result": "deleted",
}

El programa también aumenta el número de versión en uno. Hay dos razones para ello:

  1. Elasticsearch solo marca la entrada como borrada pero no la elimina del disco duro. La entrada solo desaparecerá en el curso posterior de la indexación.
  2. Cuando se trabaja con índices distribuidos en múltiples nodos, la gestión detallada de versiones es extremadamente importante. Por lo tanto, Elasticsearch marca cada cambio como una nueva versión y también la petición de borrado.

También puedes realizar modificaciones solo en un número de versión específico si lo conoces. Si ya existe una versión más nueva en el clúster que la versión especificada, el intento de modificación conduce a un mensaje de error.

PUT bibliography/novels/1?version=3
{
"author": "Marcel Proust",
"title": " À la recherche du temps perdu",
"year": "1927"
}

Además, no solo puedes llamar varias entradas a la vez, sino también crear o borrar varias con _bulk. Para esto Elasticsearch utiliza una sintaxis ligeramente diferente.

POST bibliography/novels/_bulk
{"delete": {"_id": "1"}}
{"create": {"_id": "1"}}
{"author": "Johann Wolfgang von Goethe", "title": "Die Leiden des jungen Werther", "year": "1774"}
{"create": {"_id": "2"}}
{"author": "Umberto Eco", "title": "Il nome della rosa", "year": "1980"}
{"create": {"_id": "3"}}
{"author": "Margaret Atwood", "title": "The Handmaid’s Tale", "year": "1985"}

Cada orden tiene su propia línea. En primer lugar, especifica la acción que se debe realizar (create, index, update, delete). También hay que especificar qué entrada se desea crear y dónde. Con una instrucción bulk también es posible trabajar en varios índices. Para hacer esto, debes dejar la ruta de POST vacía y asignar una ruta separada a cada acción. Al crear entradas, también debes especificar un request body en una nueva línea que contendrá el contenido de la entrada. La instrucción DELETE no requiere ningún request body, ya que se borra toda la entrada.

Hasta ahora siempre hemos dado el mismo contenido en los ejemplos, sin importar el campo que fuera, ya que Elasticsearch ha interpretado toda la información como una cadena de caracteres coherente. Sin embargo, esto no siempre es así en todos los campos. Es por eso que Elasticsearch proporciona el mapeo (mapping). Esto determina cómo los algoritmos tienen que interpretar una entrada. Puedes utilizar el siguiente código para visualizar qué asignación se utiliza actualmente en tu índice:

GET bibliography/novels/_mapping

Todos los campos se asignan a los tipos text y keyword. Pero Elasticsearch conoce 6 Core Datatypes e incluso más campos especiales. Los 6 tipos principales se subdividen parcialmente en otras subcategorías:

  • string: esto incluye tanto text como keyword. Mientras que las palabras clave se consideran coincidencias exactas, Elasticsearch asume que un texto debe ser analizado antes de que pueda utilizarse.
  • numérico: Elasticsearch reconoce diferentes valores numéricos, que difieren sobre todo en la extensión. Por ejemplo, mientras que el tipo byte puede tener valores de entre -128 y 127, long tiene un rango de -263 a 263-1.
  • date: una fecha puede especificarse exactamente al día o con una hora. También puede especificarse una fecha en forma de tiempo Unix: segundos o milisegundos desde el 1 de enero de 1970.
  • boolean: los campos formateados como booleanos pueden tener un valor verdadero o falso.
  • binario: puedes almacenar datos binarios en dichos campos. Para transmitirlos, utiliza la codificación Base64.
  • range: cómo especificar un rango. Este puede estar entre dos valores numéricos, dos datos o incluso entre dos direcciones IP.

Estas son solo las categorías principales que es probable que utilices con más frecuencia. Si quieres consultar más tipos, hazlo en la lista Elasticsearch documentation. Los tipos se diferencian, sobre todo, en que son de valor exacto (exact-value) o de texto completo (full-text). Elasticsearch entiende el contenido del campo como una entrada exacta o como un contenido que debe ser procesado primero. En el curso del mapeo, el análisis (Analyzing) también es importante. El análisis del contenido se subdivide en tokenización y normalización:

  • Tokenizing: los tokens individuales están hechos de un texto. Estos pueden incluir palabras individuales, pero también términos fijos de varias palabras.
  • Normalización: los tokens se normalizan escribiéndolos todos en minúsculas y reduciéndolos a sus formas de raíz.

Para realizar esta operación, Elasticsearch utiliza analizadores. Si incluyes un documento en el índice y has realizado la asignación correctamente, todos los contenidos se incluirán correctamente en el índice invertido. Para poder utilizar el mapping, debes crear un índice completamente nuevo. No es posible mapear campos que ya existen.

PUT bibliography
{
	"mappings": {
		"novels": {
			"properties": {
				"author": {
					"type": "text",
					"analyzer": "simple"
				},
				"title": {
					"type": "text",
					"analyzer": "standard"
				},
				"year": {
					"type": "date",
					"format": "year"
				}
			}
		}
}
}

Hemos definido los dos campos author y title como text y, por lo tanto, como full-text (texto completo), de modo que aún necesitan un analizador adecuado. Mientras que proporcionamos el analizador estándar para el campo de título de la novela, elegimos el Simple Analyzer, menos complejo, para el nombre del autor. El año de publicación, por otra parte, se fija como fecha (date) y, por lo tanto, como valor exacto (exact-value). Dado que Elasticsearch asume como formato estándar una especificación de año, mes y día, debemos cambiar esto, ya que nos gustaría limitarnos a especificar solo el año.

Buscar

En el capítulo anterior utilizamos Elasticsearch y su índice como base de datos, principalmente. El uso real de Elasticsearch, sin embargo, se centra en la búsqueda de texto completo. Esto significa que, en lugar de introducir el ID de un documento y llamar a la entrada, ahora configuramos Elasticsearch para que pueda buscar específicamente el contenido. Para utilizar el motor de búsqueda, el programa ha proporcionado el parámetro _search. Puedes utilizarlo en combinación con el método GET para visualizar todas las entradas, por ejemplo:

GET bibliography/novels/_search
Hecho

Para consultas más complejas, _search utiliza un cuerpo entre corchetes. Sin embargo, algunos servidores HTTP no prevén esto para el método GET. Es por eso que los desarrolladores decidieron que tales peticiones también funcionen como POST.

También puedes dejar la ruta en blanco para buscar en todos los índices existentes. En la salida encontrarás la información que te interesa en hits:

"hits": {
	"total": 3,
	"max_score": 1,
	"hits": [
		{
			"_index": "bibliography",
			"_type": "novels",
			"_id": "2",
			"_score": 1,
			"_source": {
				"author": "Umberto Eco",
				"title": "Il nome della rosa",
				"year": "1980"
			}
		},
	],
	}
}

Todas las demás entradas en nuestro índice también se enumeran en la salida (y solo se omiten aquí en aras de la claridad). La respuesta de Elasticsearch nos proporciona no solo el contenido real, sino también dos informaciones adicionales que pueden ayudarnos a entender la búsqueda de texto completo:

  • hits: cada entrada que coincida con los criterios de búsqueda será considerada un éxito por Elasticsearch. El programa también muestra el número de aciertos. Como en nuestro ejemplo hay 3 entradas en el índice y todas las mostramos, se considera que son en “total”: 3.
  • score: en forma de puntuación, Elasticsearch indica la relevancia de la entrada en relación con nuestra consulta de búsqueda. Dado que en nuestro ejemplo simplemente buscamos todos los mensajes, todos tienen la misma puntuación (score) de 1. Las entradas de los resultados de la búsqueda están ordenadas por relevancia en orden descendente.

En su respuesta Elasticsearch también proporciona información sobre cuántos fragmentos (shards) están involucrados en los resultados de la búsqueda, cuántos milisegundos tardó la búsqueda y si se produjo un tiempo de espera.

Elasticsearch muestra solo los 10 primeros resultados de búsqueda de forma predeterminada. Sin embargo, puedes influir en ello configurando parámetros:

  • size: ¿cuántos resultados debe mostrar Elasticsearch?
  • from: ¿cuántas entradas debe omitir el programa antes de mostrarlas?

Si has visto los primeros 10 resultados de búsqueda y solo deseas visualizar los 15 siguientes, debes utilizar una combinación de ambos parámetros:

GET bibliography/novels/_search?size=15&from=10

Elasticsearch distingue entre dos tipos de búsquedas diferentes. Por un lado, utiliza una versión Lite y, por otro, una variante más compleja que funciona con Query DSL, un lenguaje específico de búsqueda. Con la versión Lite puedes introducir tu consulta como una simple cadena de caracteres (string) directamente en la consulta de búsqueda:

GET bibliography/novels/_search?q=atwood

Sin embargo, también puedes buscar solo dentro de un campo específico:

GET bibliography/novels/_search?q=author:atwood
Hecho

De hecho, en el primer ejemplo se busca en un campo determinado sin tener que especificarlo: el campo _all. Si inserta el contenido de un documento en el índice clasificado en campos, Elasticsearch crea un campo adicional en segundo plano. Todos los contenidos de los demás campos se almacenan adicionalmente en este campo para permitir dicha búsqueda en todos los campos.

Si deseas combinar varios criterios de búsqueda, utiliza +. El carácter - excluye ciertos criterios. Sin embargo, si utilizas estos operadores, debes utilizar una codificación porcentual en la consulta de búsqueda:

GET bibliography/novels/_search?q=%2Bauthor%3Aatwood+%2Btitle%3Ahandmaid

La sintaxis de la cadena de consulta de Elasticsearch ofrece aún más sutilezas con las que puedes personalizar tu búsqueda. En la Documentación de software los desarrolladores de Elastic han resumido todos los elementos esenciales: enlaces O, frases exactas, campos vacíos o marcadores de posición.

Esta variante de búsqueda es muy adecuada para consultas sencillas, pero el procedimiento Lite puede fallar rápidamente en tareas más complejas: el peligro de introducir un error en la cadena larga es demasiado grande. Por lo tanto, con Query DSL Elasticsearch ofrece un método más conveniente. El punto de partida de tal búsqueda es el parámetro de consulta en combinación con una consulta de coincidencia:

GET bibliography/novels/_search
{
	"query": {
		"match": {
"author": "allende"
}
	}
}

El resultado nos muestra todas las entradas que contienen el término “allende” en el campo autor (author). Esto también indica que el análisis en el mapeo funcionó, porque Elasticsearch ignora mayúsculas y minúsculas. Para visualizar todas las entradas, además de la variante que ya se ha explicado anteriormente, también puedes utilizar match_all:

GET bibliography/novels/_search
{
	"query": {
		"match_all": {}
	}
}

Lo contrario de esta búsqueda es match_none. Sin embargo, Elasticsearch también te ofrece la posibilidad de buscar en varios campos con un solo término de búsqueda:

GET bibliography/novels/_search
{
	"query": {
		"multi_match": {
			"query": "la",
			"fields": ["author", "title"]
		}
	}
}

Para permitir solicitudes de búsqueda más complejas, también puedes combinar varios términos de búsqueda entre sí y darles un valor diferente. Tienes tres condiciones a tu disposición:

  • must: el término debe aparecer.
  • must_not: el término no debe aparecer.
  • should: si aparece este término, la relevancia en los resultados de la búsqueda aumenta.

En la práctica, esto se combinará con una consulta booleana:

GET bibliography/novels/search_
{
	"query": {
"bool": {
		"must": {
			"match": {
				"title": "la"
			}
},
		"must_not": {
			"match": {
				"title": "rabbit"
			}
		},
		"should": {
			"match": {
				"author": "allende"
			}
		}
	}
}
}

También puedes ampliar tu búsqueda añadiendo un filtro. Esto te permite especificar los criterios que restringen los resultados de la búsqueda:

GET bibliography/novels/search_
{
	"query": {
"bool": {
		"must": {
			"match": {
				"title": "la"
			}
},
		"filter": {
			"range": {
				"year": {
					"gte": "1950",
					"lt": "2000"
				}
			}
		}
	}
}
}

En el ejemplo anterior, vinculamos el filtro a un espectro: solo se mostrarán las entradas publicadas entre 1950 y 2000.

En resumen

Con esta herramienta tienes todo a tu disposición para implementar la búsqueda de texto completo para tu proyecto. Sin embargo, Elasticsearch ofrece otros métodos para refinar la búsqueda y hacerla más compleja. Puedes encontrar más información en la página web oficial de Elastic. Si deseas ampliar más la búsqueda de texto completo, también puede crear tus propios scripts con otros lenguajes como Groovy y Clojure.

Ventajas y desventajas de Elasticsearch

Elasticsearch puede llegar a ser una poderosa herramienta para la búsqueda de texto completo. Solo se puede culpar a Elasticsearch de una cosa y es de la pobre implementación de la idea del código abierto. Al margen de esto, la búsqueda de texto completo ofrece numerosas ventajas , también en comparación con el competidor directo Apache Solr.

Ventajas Inconvenientes
Código abierto Elastic como gatekeeper
Rápido y estable  
Escalable  
Muchos módulos de programa listos para usar (Analyzer, búsqueda de texto completo...)  
Fácil implementación gracias a Java, JSON y REST-API  
Flexible y dinámico  
¿Le ha resultado útil este artículo?
Page top