Sinónimos en Elasticsearch (HowTo)

Poco después de comenzar su viaje hacia la búsqueda, en realidad esto es perfectamente independiente de un motor de búsqueda en particular, se enfrentará a una situación en la que tendrá que manejar palabras que tengan el mismo significado.

Por ejemplo, si permite que sus usuarios busquen por ubicación, algunos pueden referirse al Reino Unido como Reino Unido o a los Estados Unidos de América como EE.UU., pero esta situación no se limita a la ubicación, cosas como un doctorado a menudo también se refieren como doctorado o doctorado.

Como primer paso, debe determinar si está en una situación con sinónimos de una palabra o palabras múltiples, esto definitivamente no es irrelevante para los sistemas de búsqueda basados en Lucene. Históricamente Lucene ha manejado sinónimos de varias palabras muy mal, básicamente tenías que construirlos un tiempo de indexación, con la posterior lista de problemas. Si tienes curiosidad, sigue esta serie para publicaciones futuras.

Si tiene una mente técnica hambrienta, estos son los varios temas y enlaces relevantes para usted:

Para esta publicación, nos vamos a centrar en cómo resolver esto en Elasticsearch en el momento de la consulta, en la publicación de seguimiento vamos a manejar los sinónimos de tiempo de indexación y sus pros y contras.

Los sinónimos se manejan en Elasticsearch y Solr, como parte de la cadena de transformación de consulta/indexación. Si no está familiarizado con las asignaciones de agujeros y las partes de análisis en Elasticsearch, le recomiendo que antes de seguir adelante, se ponga al día con estas partes, ya que en esta parte nos centraremos mucho en ellas.

Para el caso de sinónimos basados en una sola palabra o token, usaremos en Elasticsearch el filtro token de sinónimo. El primer paso sería extender su cadena de análisis actual con un filtro synonym_token_, su definición de asignación debería tener un aspecto similar:

Solicitud de Elasticsearch para configurar un nuevo índice con un filtro de sinónimos en la cadena de análisis.

podemos ver en esta imagen que definimos un nuevo filtro, llamado jobs_synonym_filter, de tipo sinónimo e incluimos dos definiciones de sinónimo. Después de haber definido el filtro, debe incluirlo dentro de un analizador, esto es lo que puede ver en la segunda configuración de la imagen anterior.

A partir de ahora, podemos usar el analizador previamente definido para procesar texto, recuerde que como con cualquier otra entrada, índice o tiempo de consulta, Elasticsearch usará la cadena seleccionada para romperla en tokens, filtrarla y enriquecerla antes de verificar el índice invertido.

Elasticsearch nos proporciona una forma estándar de comprobar cómo se comportan los analizadores, por lo que no nos vemos obligados a utilizarlos al indexar o consultar. Si desea verificar el comportamiento de un analizador, puede usar el punto final _analyze.

Por ejemplo, si pretendemos comprobar el comportamiento del analizador previamente definido, podríamos pensar en un par de palabras plausibles, PhD y Cop, en una oración que traducirán como:

  • PhD John Doe → Doctor John Doe
  • Cop John Doe → Police John Doe

En la siguiente imagen vemos un ejemplo de cómo se ejecuta dentro de Elasticsearch, podemos ver cómo se generan los diferentes tokens, incluido el tipo. El tipo será sinónimo cuando uno de los tokens se haya generado a partir de la tabla de sinónimos.

Comprobando el nuevo analizador personalizado y cómo maneja los diferentes tokens

Sin embargo, en este ejemplo podemos comenzar a ver uno de los problemas con sinónimos de tokens individuales, mapas de doctorado para un médico, sin embargo, doctor no siempre significa solo doctorado, también puede significar médico o Médico.

Podríamos pensar en manejar estos sinónimos con la misma estructura, sin embargo, esto no será posible porque la cadena de análisis generará un token para cada palabra, haciendo que la tarea del filtro de sinónimos anterior no tenga éxito. Compruebe la siguiente imagen,

Cómo se procesa el médico con el filtro de sinónimos previamente definido

puede ver cómo la palabra médico no se procesa correctamente con los sinónimos definidos. Hay una solución para esto, el filtro de sinónimos de múltiples palabras.

Sinónimos de varias palabras

Manejar correctamente este caso bajo la familia de motores de búsqueda basados en Lucene es un poco difícil, es posible que se pregunte por qué., esto se debe a que la estrategia general de Lucene es dividir el texto en tokens individuales.

Hay algunas estrategias para resolver esta situación, por ejemplo:

  • Reducción de sinónimos de múltiples palabras a una forma canónica.
  • Combine tokens relacionados y cree los sinónimos a partir de ahí.
  • Usando el filtro de grafo de sinónimos recién creado.

no cubriremos en esta entrada los dos primeros, consulte las próximas publicaciones para obtener más detalles sobre ellos. En esta entrada nos centraremos en el filtro de grafo de sinónimos, un filtro de tokens más inteligente en Lucene capaz de manejar no solo tokens, sino la relación general entre palabras.

Para usar el filtro gráfico de sinónimos, debe declararlo de manera similar al filtro introducido en la sección anterior, debe verse en algo como la siguiente imagen:

Cree un nuevo filtro basado en el filtro de grafo de sinónimos (sinónimos definidos directamente en la solicitud)

En este ejemplo definimos tres sinónimos directamente en la creación de la cadena de análisis, sin embargo, es mejor configurar la lista de sinónimos utilizando un archivo de configuración. Los sinónimos se pueden introducir utilizando el formato Solr / Lucene o WordNet.

Si nunca has oído hablar de WordNet, vale la pena comprobarlo!. WordNet es una gran base de datos léxica de inglés, sustantivos, verbos, adjetivos, adverbios se agrupan en un conjunto de sinónimos y muchos más. Este tipo de bases de datos léxicas son muy útiles cuando se intenta desarrollar una comprensión más rica del texto. Existen conceptos similares para otros idiomas, como el alemán con GermaNet.

En el siguiente par de imágenes se puede ver cómo funcionan estos nuevos sinónimos,

Comprobación de médico con el nuevo filtro de sinónimos

Comprobando al Ingeniero de sistemas Con el nuevo filtro de sinónimos

vea cómo Elasticsearch fue lo suficientemente inteligente como para descubrir cómo operar con un sinónimo de una sola palabra, como Médico, pero también cómo manejar al ingeniero de sistemas.

Pero como dicen los españoles, “no es oro todo lo que reluce” o en inglés, no todo va a ser fácil. Hay algunas recomendaciones que vamos a explorar también en otras entradas, sin embargo, en pocas palabras, si está utilizando sinónimos en Elasticsearch prefiere un phrase_query sobre un query_string, puede ver en las siguientes imágenes cómo funcionan.

Consulta de depuración con una coincidencia de frase

Consulta de depuración con una cadena de consulta

se puede ver como la última imagen, el uso de la query_string, no genera adecuada de los términos de la consulta para encontrar los documentos adecuados.

Recapitulación

En esta entrada hemos presentado las formas existentes de manejar sinónimos en Elasticsearch. Comenzando con los sinónimos de una sola palabra/token, este post introdujo por qué y cómo funcionan los sinónimos en un motor de búsqueda basado en Lucene con un enfoque especial en Elasticsearch.

Las entradas futuras resumirán los pros y los contras de cada solución, sin embargo, ya hay un consejo importante, si usa sinónimos de varias palabras, enfóquese en el uso de consultas de frases.

El artículo termina con una presentación rápida de sinónimos de varias palabras y cómo se pueden configurar.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.