2011-08-22 14 views
17

Estoy usando coincidencias difusas en mi proyecto principalmente para encontrar errores ortográficos y diferentes deletreos con los mismos nombres. Necesito entender exactamente cómo funciona la coincidencia aproximada de búsqueda elástica y cómo usa los 2 parámetros mencionados en el título.elasticsearch fuzzy matching max_expansions & min_similarity

Según tengo entendido, min_similarity es un porcentaje por el cual la cadena consultada coincide con la cadena en la base de datos. No pude encontrar una descripción exacta de cómo se calcula este valor.

La max_expansions según tengo entendido es la distancia de Levenshtein por la cual se debe ejecutar una búsqueda. Si esto realmente fuera la distancia de Levenshtein, habría sido la solución ideal para mí. De todos modos, no está funcionando Por ejemplo, tengo la palabra "Samvel"

queryStr  max_expansions   matches? 
samvel  0      Should not be 0. error (but levenshtein distance can be 0!) 
samvel  1      Yes 
samvvel  1      Yes 
samvvell  1      Yes (but it shouldn't have) 
samvelll  1      Yes (but it shouldn't have) 
saamvelll  1      No (but for some weird reason it matches with Samvelian) 
saamvelll  anything bigger than 1 No 

La documentación dice algo que realmente no entiendo:

Add max_expansions to the fuzzy query allowing to control the maximum number 
of terms to match. Default to unbounded (or bounded by the max clause count in 
boolean query). 

Así pueden agradar a alguien que me explique cómo exactamente estos parámetros afectar los resultados de búsqueda.

Respuesta

21

El min_similarity es un valor entre cero y uno. A partir de los documentos de Lucene:

For example, for a minimumSimilarity of 0.5 a term of the same length 
as the query term is considered similar to the query term if the edit 
distance between both terms is less than length(term)*0.5 

La 'distancia de edición' que se hace referencia es el Levenshtein distance.

La forma en que esta consulta funciona internamente es:

  • que encuentra todos los términos que existen en el índice que podría coincidir con el término de búsqueda, al tomar la min_similarity en cuenta
  • entonces de buscar todos aquellos condiciones.

¡Usted se imagina qué tan pesada podría ser esta consulta!

Para combatir esto, puede establecer el parámetro max_expansions para especificar el número máximo de términos coincidentes que se deben considerar.

+0

ah, entonces max_expansions y min_similarity deben usarse juntas. entonces la limitación de distancia real es hecha por 'min_similarity' y' max_expansions' funciona igual que la cláusula 'LIMIT' de MySQL. ¿Simplemente limita el número de resultados potenciales? –

+4

sí, funciona como la cláusula 'LIMIT', no en la consulta final que se ejecuta, sino en la consulta provisional que se usa para buscar la lista de términos para buscar en la consulta final – DrTech

+0

Muchas gracias :) esto ayudó mucho :) –