¿Elasticsearch sinónimo de búsqueda eficiente?: como implementar búsqueda de sinónimos

¿Elasticsearch sinónimo de búsqueda eficiente?: como implementar búsqueda de sinónimos

A la hora de implementar un buscador algo tan simple como la falta de sinónimos puede perjudicar la experiencia de uso. Pero ¿por qué digo que es algo simple? ¿Cómo se le explica a una máquina que "cerveza" y "pola" hacen referencia a lo mismo?. En un primer acercamiento a este problema, se podría pensar que la solución es cargarle a Elasticsearch el diccionario de la Real academia de la lengua española, sin embargo, la implementación de sinónimos debe realizarse de una manera más estratégica que por fuerza bruta. Antes de revisar el cómo implementar, es válido aclarar ciertos conceptos, entre ellos está la definición de grafo.

Según el Dr. Jesús Soto profesor en la Universidad Católica San Antonio de Murcia: Un grafo es un conjunto de puntos, denominados vértices o nodos, en el espacio, que están conectados por un conjunto de líneas, denominadas aristas. Se suele representar de la siguiente forma:

Adicional mente, los grafos también pueden tener la característica de ser dirigidos o no. Esta característica de dirección es similar a como funcionan las vías de un solo sentido por donde circulan los autos, relacionando únicamente en una dirección los nodos del grafo. Para el siguiente ejemplo se ve como partiendo de a se puede ir a b pero partiendo de b no podríamos desplazarnos a a.

Ya con esto podríamos definir un diccionario de sinónimos como un conjunto de grafos. Sin embargo, es menester decir que hay un factor más a tener en cuenta, y es la derivación lingüística que pueden tener las palabras; pues esto es propio de cada idioma y poseen sus reglas gramaticales. Las derivaciones lingüísticas no deben ser tenidas en cuenta para realizar el diccionario de sinónimos, pues esto resultaría en un trabajo extenso y poco eficiente. La manera de realizar esto es mediante el Stemming, el cual es un método para reducir una palabra a su raíz siguiendo las reglas gramaticales correspondientes al idioma en el que se esté trabajando. Por ejemplo, se está implementando un buscador para una aplicación que consiste en la búsqueda de locales, para este caso nos interesa que si una persona busca florero, flor o floristería obtenga los mismos resultados puesto que comparten la misma raíz, en vez de implementar un diccionario de sinónimos para este fin implementamos un Stemmer.

Una vez entendidos estos conceptos, se podría elaborar el diccionario de sinónimos. Es importante recordar que este debe ser implementado estratégicamente más que con fuerza bruta, por eso aquí hay una serie de consejos para implementar sinónimos en Elasticsearch de forma eficiente.

  • Conoce que buscan tus usuarios, si puedes guardar sus búsquedas para analizar qué es lo que buscan y con qué frecuencia ¡hazlo!

  • Crea una tabla de Excel donde puedas organizar tus sinónimos. Recuerda que hay palabras que pueden tener más de un sinónimo.

  • Usa únicamente los sinónimos necesarios para tu caso de uso.

  • Recuerda que una frase también puede ser sinónimo de una palabra y viceversa.

  • Ten en cuenta los regionalismos al momento de crear tus sinónimos.

  • Los filtros dentro de un analyzer interactúan entre ellos, y se ejecutan en orden de declaración. Ten en cuenta en donde colocas el filtro de sinónimos.

Para el ejemplo, se va a suponer que se está implementando un buscador para una aplicación dedicada a encontrar locales cercanos. Una vez hemos seguido los consejos y ya tenemos definido nuestro diccionario de sinónimos, es momento de implementarlo. Lo que haremos es crear un índice con las siguientes propiedades:

1. Stemmer:

Para definir el filtro que se va a encargar del stemming simplemente necesitamos definir un filtro del tipo stemmer y en name, especificarle el idioma del stemmer

2. Synonym_graph vs Synonym:

Cuando determinamos el tipo de sinónimos en Synonym_graph, Elasticsearch va a entender los sinónimos como un grafo no dirigido, por ejemplo "Sombrero, gorra, cachucha, chistera ", sería un grafo de la siguiente forma:

En este grafo vemos que Sombrero es sinónimo de gorra, cachucha y chistera, a su vez sombrero es sinónimo de chistera, cachucha y gorra, y así con cada uno de los términos que componen el grafo, sin embargo si seleccionamos el tipo de sinónimo Synonym Elasticsearch entenderá el diccionario de sinónimos como un grafo direccional partiendo del primer elemento que se le suministre. Continuando con el ejemplo anterior el grafo en este caso tendría la siguiente forma:

En este grafo Sombrero tiene 3 sinónimos que son gorra, cachucha y chistera, pero únicamente es así, gorra no tiene sinónimos, ni los otros elementos. Sin embargo, podemos dar cada definición por aparte lo cual daría como resultado un grafo más complejo, por ejemplo, definimos el siguiente diccionario:

Esto nos daría como resultado el siguiente grafo:

Donde nos dice que gorra, sombrero y cachucha son sinónimos entre si, sombrero tiene tres sinónimos que son gorra cachucha y chistera y chistera únicamente es sinónimo de Sombrero

3. Definición de sinónimos:

Los sinónimos en Elasticsearch se pueden definir usando dos notaciones: Apache Solr o wordnet synonyms. Estos pueden definirse como un arreglo de strings donde cada string es un sinónimo, o puede definirse por medio un archivo donde este todo el diccionario suministrando la ruta del servidor donde este se encuentra.

4. Definición de sinónimos:

Al estar contenidos dentro de un Analyzer podemos aplicar este diccionario de sinónimos a campos determinados, y tener múltiples diccionarios dependiendo de la naturaleza del campo.

Compartir:

Juan Montoya

  • 4 minutos de lectura

  • Jul 15, 2020