04.full_text match查询
文章目錄
- 1. match query 簡介
- 2. 簡寫方式
- 3. 查詢工作原理
- 4. match查詢中的fuzzniess
- 1. Levenshtein Edit Distance
- 2. fuzziness 參數取值規則
- 5. 零term的查詢
- 6. 同義詞
1. match query 簡介
返回與提供的文本,數字,日期或布爾值match的文檔。match之前analyze提供的文本。
match查詢是用于執行全文搜索的標準查詢,其中包括模糊match的選項。
樣例
GET /_search {"query": {"match" : {"message" : {"query" : "this is a test"}}} }match 的頂級參數是field,也就是你查詢針對的field
field內部可以有的參數
query: (必需)您希望在提供的中找到的文本,數字,布爾值或日期。這個其實可以進行簡寫,省略掉這個參數名。match查詢在執行搜索之前會analyze所有提供的文本。這意味著match查詢可以在文本field中搜索analyze的標記,而不是確切的詞。
analyzer: (可選,字符串)analyzer,用于將查詢值中的文本轉換為標記。默認為為映射的索引時間analyzer。如果未映射任何analyzer,則使用索引的默認analyzer。
auto_generate_synonyms_phrase_query: (可選,布爾值)如果為true,則會自動為多詞同義詞創建match詞組查詢。默認為true。有關示例,請參閱將同義詞與match查詢一起使用。
fuzziness: (可選,字符串)match允許的最大編輯距離,就是查詢詞和doc中的詞可以不一樣。有關有效值和更多信息,請參見fuzzniess。有關示例,請參見match查詢中的fuzzniess。
max_expansions:(可選,整數)查詢將擴展到的最大 term 數。默認為50。
prefix_length:(可選,整數)為模糊match保留的起始字符數。預設為0。
fuzzy_transpositions: (可選,布爾值)如果為true,則模糊match的編輯將包括兩個相鄰字符的轉置(ab→ba)。默認為true。
fuzzy_rewrite:(可選,字符串)用于重寫查詢的方法。有關有效值和更多信息,請參見rewrite參數。如果模糊參數不為0,則match查詢默認使用top_terms_blended_freqs _ $ {max_expansions}的重寫方法。
lenient:(可選,布爾值)如果為true,則將忽略基于格式的錯誤,例如為數字field提供文本查詢值。默認為false。
operator:(可選,字符串)布爾邏輯,用于解釋查詢值中的文本。有效值為:OR(默認值), AND
minimum_should_match: (可選,字符串)要返回的文檔必須match的最小子句數。有關有效值和更多信息,請參見minimum_should_match參數。
zero_terms_query: (可選,字符串)指示在analyzer刪除所有標記(例如使用停止 filter 時)時是否不返回文檔。有效值為:
none(默認):如果analyzer刪除了所有 token ,則不會返回任何文檔。
all: 返回所有文檔,類似于match_all查詢。
2. 簡寫方式
內部的query參數省略掉
GET /_search {"query": {"match": {"message": "this is a test"}} }3. 查詢工作原理
match查詢的類型為布爾值。這意味著將對提供的文本進行analyze,并且analyze過程將從提供的文本中構造一個布爾查詢。可以將operator參數設置為or或and來控制布爾子句(默認為or)。可以使用minimum_should_match參數設置要match的可選should子句的最小數量。
GET /_search {"query": {"match": {"message": {"query": "this is a test","operator": "and"}}} }可以將analyzer設置對文本執行analyze過程的analyzer。默認為field顯式mapping定義或默認的搜索analyzer。
可以將lenient參數設置為true,以忽略由數據類型不match引起的異常,例如,嘗試使用文本查詢字符串查詢數字field。默認為false。
4. match查詢中的fuzzniess
fuzzniess允許基于要查詢的field類型進行模糊match。
模糊搜索是指系統允許被搜索信息和搜索提問之間存在一定的差異,這種差異就是“模糊”在搜索中的含義。例如,查找名字Smith時,就會找出與之相似的Smithe, Smythe, Smyth, Smitt等。
es使用的模糊搜索的判斷算法是Levenshtein Edit Distance
1. Levenshtein Edit Distance
Levenshtein Edit Distance 叫做萊文斯坦距離**,是編輯距離的一種。指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。允許的編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符。
例如,單詞 “god” 只需要插入一個 ‘o’ 字符就可以變為 “good”,因此它們之間的編輯距離為 1。
2. fuzziness 參數取值規則
了解了上面兩個概念,回過頭再來看下 fuzziness 參數。
在查詢 text 或者 keyword 類型的字段時, fuzziness 可以看做是萊文斯坦距離。
fuzziness 參數的取值如下
0…2: 單詞長度為 0 到 2 之間時必須要精確匹配,這其實很好理解,單詞長度太短是沒有相似度可言的,例如 ‘a’ 和 ‘b’。
3…5: 單詞長度 3 到 5 個字母時,最大編輯距離為 1
5: 單詞長度大于 5 個字母時,最大編輯距離為 2
最佳實踐: fuzziness 在絕大多數場合都應該設置成 AUTO
如果不設置 fuziness 參數,查詢是精確匹配的。
在這種情況下,可以設置prefix_length和max_expansions來控制模糊過程。如果設置了模糊選項,則查詢將使用top_terms_blended_freqs_${max_expansions}作為其重寫方法,Fuzzy_rewrite參數允許控制如何重寫查詢。
默認情況下允許使用模糊轉置(ab→ba),但可以通過將Fuzzy_transpositions設置為false來禁用模糊轉置。
模糊match不適用于具有同義詞的 term ,或者在analyze過程中在同一位置產生多個標記的情況。這些 term 在引擎蓋下被擴展為混合了 term 頻率的特殊同義詞查詢,該查詢不支持模糊擴展。
GET /_search {"query": {"match": {"message": {"query": "this is a testt","fuzziness": "AUTO"}}} }5. 零term的查詢
如果使用的analyzer 中有 stop filter 且查詢中的所有term都是stop token ,則默認行為是根本不match任何文檔。為了更改可以使用zero_terms_query選項,該選項默認值為none,設置為all則與match_all查詢相對應。
GET /_search {"query": {"match": {"message": {"query": "to be or not to be","operator": "and","zero_terms_query": "all"}}} }6. 同義詞
match查詢通過synonym graph token filter 支持多詞同義詞擴展。使用此 filter 時,解析器將為每個多詞同義詞創建短語查詢。例如,將產生以下同義詞:“ ny,new york”:(ny OR(“new york”))
首先你在mapping中要定義對這個同義詞filter的使用才行。
也可以用連接詞來match多詞同義詞:
上面的示例創建一個布爾查詢:
(ny OR(new AND york))city
與 term ny或新的AND york match的文檔。默認情況下,參數auto_generate_synonyms_phrase_query設置為true。
總結
以上是生活随笔為你收集整理的04.full_text match查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 02.组合查询
- 下一篇: 05.full_text match_b