elasticsearh Fuzzy Query(模糊、糾錯查詢)

Fuzzy Query

模糊查詢基于”Levenshtein distance“ 編輯距離進行文檔匹配相似度

“Levenshtein distance” 下方有解釋


String field

模糊(fuzzy)查詢生成的匹配詞最大的編輯距離在fuzziness屬性中指定,然后檢查分詞字典,以確定這些生成的分詞在哪些索引中實際存在。最后查詢使用了max_expansions?來匹配單詞。

如下是一個簡單的案例:

GET /_search

{

? ? "query": {

? ? ? "fuzzy" : { "user" : "ki" }

? ? }

}

使用更多的設置:

GET /_search

{

? ? "query": {

? ? ? ? "fuzzy" : {

? ? ? ? ? ? "user" : {

? ? ? ? ? ? ? ? "value": "ki",

? ? ? ? ? ? ? ? "boost": 1.0,

? ? ? ? ? ? ? ? "fuzziness": 2,

? ? ? ? ? ? ? ? "prefix_length": 0,

? ? ? ? ? ? ? ? "max_expansions": 100

? ? ? ? ? ? }

? ? ? ? }

? ? }

}

參數(shù)說明

fuzziness:最大的編輯距離,默認AUTO(詳情見下方)

prefix_length:不能被 “模糊化” 的初始字符數(shù)。 大部分的拼寫錯誤發(fā)生在詞的結尾,而不是詞的開始。 例如通過將 prefix_length 設置為 3 ,你可能夠顯著降低匹配的詞項數(shù)量。

boost:設置查詢權重

max_expansions:默認長度為50, 如果一個模糊查詢擴展了三個或四個模糊選項, 這些新的模糊選項也許是有意義的。如果它產生 1000 個模糊選項,那么就基本沒有意義了。設置 max_expansions用來限制將產生的模糊選項的總數(shù)量。模糊查詢將收集匹配詞項直到達到 max_expansions 的限制。

transpositions:是否支持模糊換位(ab→ba)。默認是true。


Fuzziness


模糊匹配 對待 “模糊” 相似的兩個詞似乎是同一個詞。 首先,我們需要對我們所說的 模糊性 進行定義。 在1965年,Vladimir Levenshtein 開發(fā)出了 Levenshtein distance, 用來度量從一個單詞轉換到另一個單詞需要多少次單字符編輯。他提出了三種類型的單字符編輯:

一個字符 替換 另一個字符: _f_ox → _b_ox

插入 一個新的字符:sic → sic_k_

刪除 一個字符:b_l_ack → back

Frederick Damerau 后來在這些操作基礎上做了一個擴展:

相鄰兩個字符的 換位 : _st_ar → _ts_ar

舉個例子,將單詞 bieber 轉換成 beaver 需要下面幾個步驟:

把 b 替換成 v :bie_b_er → bie_v_er

把 i 替換成 a :b_i_ever → b_a_ ever

把 e 和 a 進行換位:b_ae_ver → b_ea_ver

這三個步驟表示 Damerau-Levenshtein edit distance 編輯距離為 3 。

顯然,從 beaver 轉換成 bieber 是一個很長的過程—他們相距甚遠而不能視為一個簡單的拼寫錯誤。 Damerau 發(fā)現(xiàn) 80% 的拼寫錯誤編輯距離為 1 。換句話說, 80% 的拼寫錯誤可以對原始字符串用 單次編輯 進行修正。

Elasticsearch 指定了 fuzziness 參數(shù)支持對最大編輯距離的配置,默認為 2 。

當然,單次編輯對字符串的影響取決于字符串的長度。對單詞 hat 兩次編輯能夠產生 mad , 所以對一個只有 3 個字符長度的字符串允許兩次編輯顯然太多了。 fuzziness 參數(shù)可以被設置為 AUTO ,這將導致以下的最大編輯距離:

字符串只有 1 到 2 個字符時是 0

字符串有 3 、 4 或者 5 個字符時是 1

字符串大于 5 個字符時是 2

當然,你可能會發(fā)現(xiàn)編輯距離 2 仍然是太多了,返回的結果似乎并不相關。 把最大 fuzziness 設置為 1 ,你可以得到更好的結果和更好的性能。

This query can be very heavy if prefix_length is set to 0 and if max_expansions is set to a high number. It could result in every term in the index being examined! 如果將prefix_length設置為0,并且將max_expanations設置為高值,則此查詢可能非常繁重。它可能導致索引中的每一項都被檢查!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容