2011-08-22 16 views
17

sto usando fuzzy matching nel mio progetto principalmente per trovare errori di ortografia e le diverse grafie con gli stessi nomi. Ho bisogno di capire esattamente come funziona la corrispondenza fuzzy della ricerca elastica e come utilizza i 2 parametri menzionati nel titolo.elasticsearch fuzzy matching max_expansions & min_similarity

Come ho capito la min_similarity è una percentuale in base alla quale la stringa interrogata corrisponde alla stringa nel database. Non sono riuscito a trovare una descrizione esatta di come viene calcolato questo valore.

Il max_expansions come ho capito è la distanza Levenshtein con la quale deve essere eseguita una ricerca. Se questa fosse davvero la distanza di Levenshtein sarebbe stata la soluzione ideale per me. In ogni caso, non funziona Per esempio io ho la parola "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 documentazione dice qualcosa che in realtà non capisco:

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). 

Così possono piacere a chiunque spiegare a me come esattamente questi parametri influenzare i risultati della ricerca.

risposta

21

Il min_similarity è un valore compreso tra zero e uno. Dalla documentazione 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 

'Modifica distanza' che si riferisce a è il Levenshtein distance.

Il modo in cui questa query funziona internamente è:

  • che trova tutti i termini che esistono nell'indice che potrebbe corrispondere al termine di ricerca, quando prende il min_similarity conto
  • allora ricerche per tutti coloro termini.

Potete immaginare quanto questa query potrebbe essere pesante!

Per combattere questo, è possibile impostare il parametro max_expansions per specificare il numero massimo di termini corrispondenti che dovrebbero essere considerati.

+0

ah, quindi max_expansions e min_similarity devono essere utilizzati insieme. quindi la limitazione della distanza effettiva viene eseguita da 'min_similarity' e' max_expansions' funziona proprio come la clausola 'LIMIT' di MySQL? Limita solo il numero di risultati potenziali? –

+4

Sì, funziona come la clausola 'LIMIT', non sulla domanda finale che viene eseguito, ma sulla query ad interim che viene utilizzato per trovare l'elenco dei termini per cercare nella query finale – DrTech

+0

Grazie mille :) questo ha aiutato Un sacco :) –