SearchRequestBuilder查詢條件選項
1、遊标查詢(快速,批量):
scroll 查詢可以用來對 Elasticsearch 有效地執行大批量的文檔查詢,而又不用付出深度分頁那種代價
圖1
2、精确值查找(term查詢)
用于處理數字(numbers)、布爾值(Booleans)、日期(dates)以及文本(text)
關鍵點:term和terms是包含(contains)操作,而非 等值(equals)
注意點:term查詢不會對查詢詞進行分析,下圖說明了情況
圖2
圖3 3、範圍查詢(range 查詢):日期範圍、字元串範圍
字元串範圍可采用 字典順序(lexicographically)或字母順序(alphabetically)
"range": {
"lowerversion" : {
"lte": "3.0.1265 "
}
"highversion": {
"gte" : "3.0.1265",
}
}
4、match查詢
指定多字段必須包含的情況(隻想搜尋包含所有詞項的文檔)
關鍵解讀:對搜尋串分析,隻要分析詞有至少一個比對到就召回
圖4 5 、match 控制查詢精度:
match 查詢支援 minimum_should_match 最小比對參數, 這讓我們可以指定必須比對的詞項數用來表示一個文檔是否相關。我們可以将其設定為某個具體數字,更常用的做法是将其設定為一個百分數,因為我們無法控制使用者搜尋時輸入的單詞數量:
圖5
圖6
圖7 解決短語比對中比對不到的問題(多級聯合精度控制)
圖8
6、dis_max查詢(分離最大化查詢)
圖9 跟bool查詢的優勢對比,bool查詢隻是簡單的bool分項分數相加;dis_max提升了多字段最佳比對的得分,削弱了單一字段特别高對整體得分的影響
7、短語比對(match_phrase 查詢 ):
短語比對或許是過于嚴格了,我們能夠通過使用slop參數将靈活度引入短語比對中,slop 參數告訴 match_phrase 查詢詞條相隔多遠時仍然能将文檔視為比對。
圖10 slop短語查詢将查詢詞條的鄰近度考慮到最終相關度 _score中,slop限制詞項間距大小;在限制間距範圍内間距越近,得分越高。(slop隻能用于match_phrase中,minimum_should_match隻能用于match中)
8、prefix 字首查詢(字首查詢存在性能問題,包括wildcard 和 regexp 查詢,存在嚴重的資源消耗問題)
match_phrase_prefix 查詢,即時搜尋(instant search) 能力:使用者已經漸漸習慣在輸完查詢内容之前,就能為他們展現搜尋結果
圖11 prefix查詢是一個詞級别的底層的查詢,它不會在搜尋之前分析查詢字元串,它假定傳入字首就正是要查找的字首。是以有下面的結果
圖12 9、
wildcard
和
regexp
(模糊和正則)比對
對于standard分詞器,皮膚名稱字段中的英文單詞,比如iphone、iso、tfbodys等不會被分詞,可以考慮使用下面的正則比對對輸入串進行比對
圖13
圖14
10、Ngrams 在部分比對的應用(邊界 n-grams)
設定ngram=3結果如下(ngram是在建索引mapping時指定)
ngram與prefix差別:
ngram在索引層面解決問題,建立索引時需指定字段及ngram的範圍,資料需重建索引(reindex);prefix查詢之前不會分析(類似term)
圖15
圖16
圖17
圖18
11、組合查詢中的權重評分控制
圖19 綜合使用match和match_phrase:
1、 使用match通過精度控制包含和排除文檔
2、 使用match_phrase增加比對到的文檔的相關度評分
圖20 針對***搜尋需求
1、 嘗試使用ngram解決字段中包含英文名稱搜尋的問題
2、 使用組合查詢,match召回控制精度(對應輸入法需求,無關項不召回),match_phrase控制相關度的評分