目錄html
子曰,溫故而知新,能夠爲師也。學習的過程就是不斷的回顧,總結,總結,再總結。首先,一塊兒來回顧下上篇 search API中的內容。
爲了可以更透徹的理解 rest client search API 的使用,我專門整理了相關對象之間的關係圖,一塊兒來看下。java
由上圖看出, QueryBuilder
是整個查詢操做的核心,決定了查詢什麼樣的數據和指望獲得什麼結果這些核心的問題。正則表達式
QueryBuilder
只是一個接口,須要具體的實體類才能夠。那麼如何建立 QueryBuilder
的實例呢?有兩種方式算法
QueryBuilder
實現類的構造函數QueryBuilders
工具類建立下面就來看下經常使用的查詢及其 API 有哪些shell
查詢語句以下json
GET /_search { "query": { "match_all": {} } }
對應的 QueryBuilder
Class 爲 MatchAllQueryBuilder
api
具體方法爲 QueryBuilders.matchAllQuery()app
像使用 match
或者 query_string
這樣的高層查詢都屬於全文查詢,elasticsearch
date
) 或整數(integer
) 字段,會將查詢字符串分別做爲日期或整數對待。not_analyzed
)未分析的精確值字符串字段,會將整個查詢字符串做爲單個詞項對待。analyzed
)已分析的全文字段,會先將查詢字符串傳遞到一個合適的分析器,而後生成一個供查詢的詞項列表組成了詞項列表,後面就會對每一個詞項逐一執行底層查詢,將查詢結果合併,而且爲每一個文檔生成最終的相關度評分。ide
match
查詢的單個詞的步驟是什麼?analyzed
, not_analyzed
match
查詢在執行時就會是單個底層的 term
查詢match
查詢能夠接受 text/numeric/dates 格式的參數,分析,並構建一個查詢。
GET /_search { "query": { "match" : { "message" : "this is a test" } } }
上面的實例中 message
是一個字段名。
對應的 QueryBuilder
class : MatchQueryBuilder
具體方法 : QueryBuilders.matchQuery()
所有的 API 列表以下(連接均指向 elasticsearch 官網)
這種類型的查詢不須要分析,它們是對單個詞項操做,只是在倒排索引中查找準確的詞項(精確匹配)而且使用 TF/IDF 算法爲每一個包含詞項的文檔計算相關度評分 _score
。
term
查詢可用做精確值匹配,精確值的類型則能夠是數字,時間,布爾類型,或者是那些 not_analyzed 的字符串。
對應的 QueryBuilder
class 是TermQueryBuilder
具體方法是 QueryBuilders.termQuery()
terms
查詢容許指定多個值進行匹配。若是這個字段包含了指定值中的任何一個值,就表示該文檔知足條件。
對應的 QueryBuilder
class 是 TermsQueryBuilder
具體方法是 QueryBuilders.termsQuery()
wildcard
通配符查詢是一種底層基於詞的查詢,它容許指定匹配的正則表達式。並且它使用的是標準的 shell 通配符查詢:
?
匹配任意字符*
匹配 0 個或多個字符wildcard
須要掃描倒排索引中的詞列表才能找到全部匹配的詞,而後依次獲取每一個詞相關的文檔 ID。
因爲通配符和正則表達式只能在查詢時才能完成,所以查詢效率會比較低,在須要高性能的場合,應當謹慎使用。
對應的 QueryBuilder
class 是 WildcardQueryBuilder
具體方法是 QueryBuilders.wildcardQuery()
複合查詢會將其餘的複合查詢或者葉查詢包裹起來,以嵌套的形式展現和執行,獲得的結果也是對各個子查詢結果和分數的合併。能夠分爲下面幾種:
常常用在使用 filter 的場合,全部匹配的文檔分數都是一個不變的常量
能夠將多個葉查詢和組合查詢再組合起來,可接受的參數以下
must_not
文檔必須不匹配才能被包含進來should
若是知足其中的任何語句,都會增長分數;即便不知足,也沒有影響filter
以過濾模式進行,不評分,可是必須匹配叫作分離最大化查詢,它會將任何與查詢匹配的文檔都做爲結果返回,可是隻是將其中最佳匹配的評分做爲最終的評分返回。
容許爲每一個與主查詢匹配的文檔應用一個函數,可用來改變甚至替換原始的評分
用來控制(提升或下降)複合查詢中子查詢的權重。
這裏比較重要的一個是 Wrapper Query,是說能夠接受任何其餘 base64 編碼的字符串做爲子查詢。
主要應用場合就是在 Rest High-Level REST client 中接受 json 字符串做爲參數。好比使用 gson 等 json 庫將要查詢的語句拼接好,直接塞到 Wrapper Query 中查詢就能夠了,很是方便。
Wrapper Query 對應的 QueryBuilder
class 是WrapperQueryBuilder
具體方法是 QueryBuilders.wrapperQuery()
本文對 elasticsearch rest high client 中的查詢構建進行了總結和整理,對經常使用的 API 作了簡要的介紹。讀者若是要查看完整的構建查詢的 API 列表,可參考此處