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 ".
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 .
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.
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.
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
. 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.Después de consultarlo, estas consultas produjeron un resultado:
Las consultas no:
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 50Longitud 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 .
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/