1. 程式人生 > 其它 >記錄ElasticSearch模糊查詢

記錄ElasticSearch模糊查詢

sourceBuilder.query(QueryBuilders.fuzzyQuery("name", "李").fuzziness(Fuzziness.ZERO));

版本:ElasticSearch7.8


fuzzyQuery 返回包含與搜尋字詞相似的字詞文件:

為了找到相似的術語,fuzzy查詢將在指定的編輯距離內建立一組搜尋詞的所有可能的變體或擴充套件,查詢然後返回每個擴充套件的完全匹配。

如果search.allow_expensive_queries 設定為false,則不會執行模糊查詢。

編輯距離,是將一個術語轉換成另一個術語所需更改一個字元的次數(Levenshtein編輯距離衡量)。這些更改可以包括:
更改字元,box → fox
刪除字元,black → lack
插入字元,sic → sick
轉置兩個字元,act → cat
為了查詢相似的術語,模糊查詢會建立一個集合用來列舉所有可能的變體和擴充套件,染灰返回每個擴充套件的完全匹配。


Fuzziness
一些搜尋和API支援的引數,允許進行不精確的模糊查詢,引數為fuzziness

在查詢text或是keyword時,fuzziness被解釋為Levenshtein編輯距離(一個字串要與另一個字串相同必須更改的一個字元數),fuzziness可以為0,1,2(Levenshtein允許的最大編輯距離(或編輯次數));

AUTO:根據術語長度生成編輯距離。可以選擇提過距離引數AUTO: [low], [high]。如果未指定則預設為AUTO: [3], [6];AUTO通常應該是fuzziness。

0-2 必須完全匹配
3-5 允許一次編輯
大於5 允許兩次編輯

如上查詢,結果是
{"name":"李元浩","sex":"小gay虎","tel":"2200"}

如果設為 Fuzziness.ONE :

sourceBuilder.query(QueryBuilders.fuzzyQuery("name", "李").fuzziness(Fuzziness.ONE));

結果:

{"name":"李元浩","sex":"小gay虎","tel":"2200"}
{"name":"一號","sex":"男","tel":"4396"}
{"name":"二號","sex":"男","tel":"2800"}