paint-brush
Cómo usar coincidencias de consultas aproximadas en Elasticsearchpor@brilianfird
33,710 lecturas
33,710 lecturas

Cómo usar coincidencias de consultas aproximadas en Elasticsearch

por Brilian Firdaus5m2020/12/06
Read on Terminal Reader
Read this story w/o Javascript

Demasiado Largo; Para Leer

Elasticsearch puede manejar errores tipográficos fácilmente con Fuzzy Query. Elasticsearch no se usa sin formato para buscar en el índice invertido. El Elasticsearch no tiene que ser la coincidencia exacta con los términos en el índice invertido. En Elasticsearch, la consulta difusa significa que los términos no son las coincidencias exactas del índice. El resultado es 2, pero puede usar la borrosidad para encontrar la palabra correcta para un error tipográfico en la borrosidad de Elasticsearch en Match Query. Para 6 caracteres, Elasticsearch por defecto permitirá 2 distancias de edición.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Cómo usar coincidencias de consultas aproximadas en Elasticsearch
Brilian Firdaus HackerNoon profile picture

El error tipográfico es algo que sucede con frecuencia y puede reducir la experiencia del usuario; afortunadamente, Elasticsearch puede manejarlo fácilmente con Fuzzy Query.

Manejar errores tipográficos es imprescindible si está creando un sistema de autocompletado avanzado con Elasticsearch.

Si desea crear uno simple, puede leer mis otros artículos " Crear un autocompletado simple con Elasticsearch ".

que es la logica difusa

La lógica difusa es una lógica matemática en la que la verdad de las variables puede ser cualquier número entre 0 y 1. Es diferente con una lógica booleana que solo tiene los valores de verdad 0 o 1.

En Elasticsearch, la consulta difusa significa que los términos de las consultas no tienen que coincidir exactamente con los términos del índice invertido.

Para calcular la distancia entre consultas, Elasticsearch utiliza el algoritmo de distancia de Levenshtein .

Cómo calcular la distancia usando el algoritmo de distancia de Levenshtein

Calcular una distancia con el algoritmo de distancia de Levenshtein es fácil.

Solo necesita comparar la primera y la segunda palabra carácter por carácter.

Si el carácter es diferente, puede agregar la distancia entre las palabras en uno.

Veamos un ejemplo, cómo calcular la distancia entre la palabra errada común “Gppgle” con la palabra correcta “Google”.

Después de calcular la distancia entre "Gppgle" y "Google" con el algoritmo de distancia de Levenshtein, podemos ver que la distancia es 2.

Consulta difusa en Elasticsearch

Manejar errores tipográficos en Elasticsearch con Fuzzy Query también es simple.

Comencemos con hacer un ejemplo de la palabra tipográfica "Gppgle".

Solicitud

Cuando usamos la consulta de coincidencia normal, Elasticsearch analizará primero la consulta "gppgle" antes de buscarla en Elasticsearch.

El único término en el índice invertido es "google" y no coincide con el término "gppgle". Por lo tanto, Elasticsearch no devolverá ningún resultado.

Ahora, probemos la búsqueda difusa de Elasticsearch en Match Query.

Como puede ver, con fuzzy, Elasticsearch devolvió una respuesta.

Hemos aprendido antes que "gppgle" y "google" tienen la distancia de 2.

En la consulta, insertamos

 "fuzziness":"AUTO"
en lugar de un número. ¿Por qué está funcionando?

Elasticsearch determinará qué distancia de borrosidad es apropiada si usamos

 "AUTO"
valor en el
 "fuzziness"
campo.

Para 6 caracteres, Elasticsearch por defecto permitirá 2 distancias de edición.

 "AUTO"
es preferible la borrosidad, pero puede ajustarlo con un número exacto si lo desea.

Ahora, probemos con un número exacto para demostrar que "gppgle" y "google" tienen una distancia de 2.

cuando usamos

 "fuzziness":"1"
, Elasticsearch no devuelve ningún resultado.

Con

 "fuzziness":"2"
, sin embargo, Elasticsearch devolvió el documento "google".

Esto prueba nuestro cálculo de distancia anterior de "gppgle" y "google" con el algoritmo de distancia de Levenshtein, en el que el resultado es 2.

Dos tipos de consulta difusa en Elasticsearch

En el ejemplo anterior, usamos una consulta difusa como parámetro dentro de Match Query.

Pero hay otra forma de utilizar la función difusa, Fuzzy Query.

¡Parece ser lo mismo! Entonces, ¿cuál es la diferencia entre ellos?

Consulta difusa

Fuzzy Query funciona simplemente como Term Query, la consulta a Elasticsearch no se analiza y se usa sin procesar para buscar en el índice invertido.

Por ejemplo, indexemos un documento más "Hong Kong" .

Veamos qué términos produce el analizador con la API Analyze de Elasticsearch.

Como puedes ver, el

 standard_analyzer
producir dos términos, "hong" y "kong".

Si lee mi otro artículo " Elasticsearch: texto frente a palabra clave ", sabrá que si usamos una consulta de términos para buscar "Hong Kong", no obtendremos ningún resultado.

Esto se debe a que no hay ningún término que tenga menos de 2 ediciones de distancia con "Hong Kong" en Elasticsearch.

Ahora, probemos Fuzzy Query con "Hpng" .

El término "Hpng" en la consulta y el término "hong" en Elasticsearch tienen una distancia de dos.

Recuerde que el término consultado y el término en el índice invertido distingue entre mayúsculas y minúsculas, la distancia "2" proviene de la diferencia entre "Hp" y "ho".

Hacer coincidir la consulta con el parámetro Fuzziness

Match Query con el parámetro fuzziness es más preferible que Fuzzy Query. El analizador en la consulta analizará su consulta antes de buscarla en el índice invertido.

Intentemos la misma consulta que hicimos en la sección de Consultas Fuzzy.

Como era de esperar, ¡ambas consultas arrojaron un resultado!

La primera consulta, "Hpng Kong" se analiza en "hpng" y "kong". Ambos términos "hpng" y "kong" existen en el índice invertido.

"hpng" y "hong" emparejados con una distancia de 1.

Mientras que "kong" y "kong" combinan perfectamente.

Una cosa a tener en cuenta si planea usar Match Query es que cada uno de los términos en la consulta permitirá la confusión.

Podemos intentar consultar con "hggg kggg" que tiene una distancia de edición de 4 con "Hong Kong" usando

 "fuzziness":2
.

Ajuste de la consulta difusa en Elasticsearch

Puede ajustar la consulta aproximada para que coincida con su caso de uso.

En esta sección, escribiré sobre los parámetros que podemos cambiar en la consulta.

Borrosidad

La borrosidad es el corazón de Fuzzy Query.

El valor que le pasamos a este parámetro es la distancia máxima permitida.

Hay dos tipos de valores que podemos pasar, un número entero para la distancia máxima exacta y

 "AUTO"
.

los

 "AUTO"
El valor permite que la falta de claridad en la consulta sea dinámica.

Podemos sintonizar 2 parámetros en el

 "AUTO"
valor y escribirlo como
 "AUTO:[low],[high]"
. La consulta establecerá la borrosidad en 0 si la longitud del término está por debajo del valor bajo. Si la longitud del término está entre el valor bajo y alto, la consulta establecerá la imprecisión en 1. Por último, si la duración del término es mayor que el valor alto, la consulta establecerá la imprecisión en 2.

Elasticsearch utilizará 3 y 6 como valores predeterminados si no se determina el valor bajo y alto.

Usemos un ejemplo con un documento "Fuzzy Query en Elasticsearch le permite manejar errores tipográficos".

Podemos probar algunas consultas para probar el mecanismo de

 AUTO
describimos anteriormente.

  • “tp”: 1 editar distancia desde “hasta”.
  • “Fyzzy”: 1 distancia de edición de “Fuzzy”.
  • “Fyzyy”: 2 distancias de edición de “Fuzzy”.
  • “Elastissearcc”: 2 distancias de edición de “Fuzzy”.
  • “Elestissearcc”: 3 distancias de edición de “Fuzzy”.

Después de consultarlo, estas consultas produjeron un resultado:

  • "efervescente"
  • “Elastisearcc”

Las consultas no:

  • "tp"
  • “Fyzyy”
  • “Elestissearcc”

Transposiciones

 transpositions
permitirá que su consulta calcule las transposiciones de dos caracteres adyacentes (ab -> ba) como 1 distancia.

Por ejemplo, si configuramos el

 transpositions
a verdadero, obtendremos un resultado si consultamos con "leasticsearcc".

Pero si lo configuramos como

 false
, no habrá ningún resultado de Elasticsearch.

El Elasticsearch por defecto el

 transpositions
estableciendo en verdadero.

No podemos establecer esta configuración en la consulta de coincidencia. La consulta de coincidencia siempre calculará

 transpositions
como 1 distancia.

Expansiones máximas

 max_expansions
determinará el resultado máximo que obtendrá de su consulta.

Si configura el

 max_expansions
a 1 y hay 2 documentos en Elasticsearch que son apropiados para su consulta, Elasticsearch solo devolverá 1.

Tenga en cuenta que

 max_expansions
se aplica al nivel de fragmento. Entonces, si tiene muchos fragmentos en Elasticsearch, incluso si configura el
 max_expansion
a 1, la consulta podría devolver más resultados.

El valor predeterminado para

 max_expansions
es 50

Longitud del prefijo

 prefix_length
es el número de caracteres de prefijo que no se consideran en la consulta aproximada.

Por ejemplo, si configuramos el

 prefix_length
a 1, no obtendremos ningún resultado si consultamos "llasticsearch".

los

 prefix_length
estableciendo valores predeterminados en
 0
.

Volver a escribir

Tu puedes cambiar

 rewrite
parámetro si desea cambiar la puntuación de los resultados.

Puede encontrar más información sobre el parámetro de reescritura en la documentación de Elasticsearch .

Conclusión

Manejar un error tipográfico en Elasticsearch es muy fácil y puede mejorar la experiencia del usuario.

La forma más sencilla de manejar un error tipográfico es simplemente agregar

 "fuzziness":"AUTO"
en su consulta de coincidencia.

Si desea ajustar la consulta, hay algunos parámetros que puede cambiar, siendo la "borrosidad" la más importante.

¡Gracias por leer hasta el final!

Publicado anteriormente en https://codecurated.com/blog/how-to-handle-typos-in-elasticsearch-using-fuzzy-query/