在實際的搜尋中,我們有時候會打錯字,進而導緻搜尋不到。在elasticsearch中,我們可以使用fuzziness屬性來進行模糊查詢,進而達到搜尋有錯别字的情形。
match查詢具有“fuziness”屬性。它可以被設定為“0”, “1”, “2”或“auto”。“auto”是推薦的選項,它會根據查詢詞的長度定義距離。
fuzzy query
傳回包含與搜尋詞相似的詞的文檔,以levenshtein編輯距離測量。
編輯距離是将一個術語轉換為另一個術語所需的一個字元更改的次數。 這些更改可以包括:
更改字元(box→fox)
删除字元(black→lack)
插入字元(sic→sick)
轉置兩個相鄰字元(act→cat)
為了找到相似的詞,模糊查詢會在指定的編輯距離内建立搜尋詞的所有可能變化或擴充的集合。 查詢然後傳回每個擴充的完全比對。
例子
我們首先輸入如下的一個文檔到fuzzyindex索引中:
如果這個時候,我們進行如下的搜尋:
那麼是沒有任何被搜尋到的結果,這是因為“i like blue sky" 裡分詞後沒有ski這個詞。
這個時候,如果我們使用如下的搜尋:
那麼顯示的結果是:
顯然是找到我們需要的結果了。這是因為sky和ski時間上是隻差别一個字母。
同樣,如果我們選用“auto”選項看看:
它顯示的結果和上面的是一樣的。也可以進行比對。
如果我們進行如下的比對:
那麼它不能比對任何的結果,但是,如果我們進行如下的搜尋:
我們也可以使用如下的格式:
那麼它可以顯示搜尋的結果,這是因為我們能夠容許兩個編輯的錯誤。
模糊性是拼寫錯誤的簡單解決方案,但具有很高的cpu開銷和非常低的精度。
參考:
【1】https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-fuzzy-query.html