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 en lugar de un número. ¿Por qué está funcionando? "fuzziness":"AUTO" Elasticsearch determinará qué distancia de borrosidad es apropiada si usamos valor en el campo. "AUTO" "fuzziness" Para 6 caracteres, Elasticsearch por defecto permitirá 2 distancias de edición. es preferible la borrosidad, pero puede ajustarlo con un número exacto si lo desea. "AUTO" Ahora, probemos con un número exacto para demostrar que "gppgle" y "google" tienen una distancia de 2. cuando usamos , Elasticsearch no devuelve ningún resultado. "fuzziness":"1" Con , sin embargo, Elasticsearch devolvió el documento "google". "fuzziness":"2" 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 producir dos términos, "hong" y "kong". standard_analyzer Si lee mi otro artículo " ", sabrá que si usamos una consulta de términos para buscar "Hong Kong", no obtendremos ningún resultado. Elasticsearch: texto frente a palabra clave 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 El valor permite que la falta de claridad en la consulta sea dinámica. "AUTO" Podemos sintonizar 2 parámetros en el valor y escribirlo como . 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. "AUTO" "AUTO:[low],[high]" 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 describimos anteriormente. AUTO “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 permitirá que su consulta calcule las transposiciones de dos caracteres adyacentes (ab -> ba) como 1 distancia. transpositions Por ejemplo, si configuramos el a verdadero, obtendremos un resultado si consultamos con "leasticsearcc". transpositions Pero si lo configuramos como , no habrá ningún resultado de Elasticsearch. false El Elasticsearch por defecto el estableciendo en verdadero. transpositions No podemos establecer esta configuración en la consulta de coincidencia. La consulta de coincidencia siempre calculará como 1 distancia. transpositions Expansiones máximas determinará el resultado máximo que obtendrá de su consulta. max_expansions Si configura el a 1 y hay 2 documentos en Elasticsearch que son apropiados para su consulta, Elasticsearch solo devolverá 1. max_expansions Tenga en cuenta que se aplica al nivel de fragmento. Entonces, si tiene muchos fragmentos en Elasticsearch, incluso si configura el a 1, la consulta podría devolver más resultados. max_expansions max_expansion El valor predeterminado para es 50 max_expansions Longitud del prefijo es el número de caracteres de prefijo que no se consideran en la consulta aproximada. prefix_length Por ejemplo, si configuramos el a 1, no obtendremos ningún resultado si consultamos "llasticsearch". prefix_length los estableciendo valores predeterminados en . prefix_length 0 Volver a escribir Tu puedes cambiar parámetro si desea cambiar la puntuación de los resultados. rewrite 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 en su consulta de coincidencia. "fuzziness":"AUTO" 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/