Elasticsearch Java Rest Client API 整理總結 (三)——Building Queries

上篇回顧

子曰,溫故而知新,能夠爲師也。學習的過程就是不斷的回顧,總結,總結,再總結。首先,一塊兒來回顧下上篇 search API中的內容。
爲了可以更透徹的理解 rest client search API 的使用,我專門整理了相關對象之間的關係圖,一塊兒來看下。java

search API 關係圖

由上圖看出, QueryBuilder 是整個查詢操做的核心,決定了查詢什麼樣的數據和指望獲得什麼結果這些核心的問題。正則表達式

QueryBuilder 只是一個接口,須要具體的實體類才能夠。那麼如何建立 QueryBuilder 的實例呢?有兩種方式算法

  • 經過 QueryBuilder 實現類的構造函數
  • 使用 QueryBuilders 工具類建立

Building Queries

下面就來看下經常使用的查詢及其 API 有哪些shell

匹配全部的查詢

查詢語句以下json

GET /_search
{
    "query": {
        "match_all": {}
    }
}

對應的 QueryBuilder Class 爲 MatchAllQueryBuilderapi

具體方法爲 QueryBuilders.matchAllQuery()app

全文查詢 Full Text Queries

什麼是全文查詢?

像使用 match 或者 query_string 這樣的高層查詢都屬於全文查詢,elasticsearch

  • 查詢 日期(date) 或整數(integer) 字段,會將查詢字符串分別做爲日期或整數對待。
  • 查詢一個( not_analyzed )未分析的精確值字符串字段,會將整個查詢字符串做爲單個詞項對待。
  • 查詢一個( analyzed )已分析的全文字段,會先將查詢字符串傳遞到一個合適的分析器,而後生成一個供查詢的詞項列表

組成了詞項列表,後面就會對每一個詞項逐一執行底層查詢,將查詢結果合併,而且爲每一個文檔生成最終的相關度評分。ide

Match

match 查詢的單個詞的步驟是什麼?

  1. 檢查字段類型,查看字段是 analyzed, not_analyzed
  2. 分析查詢字符串,若是隻有一個單詞項, match 查詢在執行時就會是單個底層的 term 查詢
  3. 查找匹配的文檔,會在倒排索引中查找匹配文檔,而後獲取一組包含該項的文檔
  4. 爲每一個文檔評分

構建 Match 查詢

match 查詢能夠接受 text/numeric/dates 格式的參數,分析,並構建一個查詢。

GET /_search
{
    "query": {
        "match" : {
            "message" : "this is a test"
        }
    }
}

上面的實例中 message 是一個字段名。

對應的 QueryBuilder class : MatchQueryBuilder

具體方法 : QueryBuilders.matchQuery()

全文查詢 API 列表

所有的 API 列表以下(連接均指向 elasticsearch 官網)

Search Query QueryBuilder Class Method in QueryBuilders
Match MatchQueryBuilder QueryBuilders.matchQuery()
Match Phrase MatchPhraseQueryBuilder QueryBuilders.matchPhraseQuery()
Match Phrase Prefix MatchPhrasePrefixQueryBuilder QueryBuilders.matchPhrasePrefixQuery()
Multi Match MultiMatchQueryBuilder QueryBuilders.multiMatchQuery()
Common Terms CommonTermsQueryBuilder QueryBuilders.commonTermsQuery()
Query String QueryStringQueryBuilder QueryBuilders.queryStringQuery()
Simple Query String SimpleQueryStringBuilder QueryBuilders.simpleQueryStringQuery()

基於詞項的查詢

這種類型的查詢不須要分析,它們是對單個詞項操做,只是在倒排索引中查找準確的詞項(精確匹配)而且使用 TF/IDF 算法爲每一個包含詞項的文檔計算相關度評分 _score

Term

term 查詢可用做精確值匹配,精確值的類型則能夠是數字,時間,布爾類型,或者是那些 not_analyzed 的字符串。

對應的 QueryBuilder class 是TermQueryBuilder

具體方法是 QueryBuilders.termQuery()

Terms

terms 查詢容許指定多個值進行匹配。若是這個字段包含了指定值中的任何一個值,就表示該文檔知足條件。

對應的 QueryBuilder class 是 TermsQueryBuilder

具體方法是 QueryBuilders.termsQuery()

Wildcard

wildcard 通配符查詢是一種底層基於詞的查詢,它容許指定匹配的正則表達式。並且它使用的是標準的 shell 通配符查詢:

  • ? 匹配任意字符
  • * 匹配 0 個或多個字符

wildcard 須要掃描倒排索引中的詞列表才能找到全部匹配的詞,而後依次獲取每一個詞相關的文檔 ID。

因爲通配符和正則表達式只能在查詢時才能完成,所以查詢效率會比較低,在須要高性能的場合,應當謹慎使用。

對應的 QueryBuilder class 是 WildcardQueryBuilder

具體方法是 QueryBuilders.wildcardQuery()

基於詞項 API 列表

Search Query QueryBuilder Class Method in QueryBuilders
Term TermQueryBuilder QueryBuilders.termQuery()
Terms TermsQueryBuilder QueryBuilders.termsQuery()
Range RangeQueryBuilder QueryBuilders.rangeQuery()
Exists ExistsQueryBuilder QueryBuilders.existsQuery()
Prefix PrefixQueryBuilder QueryBuilders.prefixQuery()
Wildcard WildcardQueryBuilder QueryBuilders.wildcardQuery()
Regexp RegexpQueryBuilder QueryBuilders.regexpQuery()
Fuzzy FuzzyQueryBuilder QueryBuilders.fuzzyQuery()
Type TypeQueryBuilder QueryBuilders.typeQuery()
Ids IdsQueryBuilder QueryBuilders.idsQuery()

複合查詢

什麼是複合查詢?

複合查詢會將其餘的複合查詢或者葉查詢包裹起來,以嵌套的形式展現和執行,獲得的結果也是對各個子查詢結果和分數的合併。能夠分爲下面幾種:

  • constant_score query

    常常用在使用 filter 的場合,全部匹配的文檔分數都是一個不變的常量

  • bool query

    能夠將多個葉查詢和組合查詢再組合起來,可接受的參數以下

    • must : 文檔必須匹配這些條件才能被包含進來
    • must_not 文檔必須不匹配才能被包含進來
    • should 若是知足其中的任何語句,都會增長分數;即便不知足,也沒有影響
    • filter 以過濾模式進行,不評分,可是必須匹配
  • dis_max query

    叫作分離最大化查詢,它會將任何與查詢匹配的文檔都做爲結果返回,可是隻是將其中最佳匹配的評分做爲最終的評分返回。

  • function_score query

    容許爲每一個與主查詢匹配的文檔應用一個函數,可用來改變甚至替換原始的評分

  • boosting query

    用來控制(提升或下降)複合查詢中子查詢的權重。

複合查詢列表

Search Query QueryBuilder Class Method in QueryBuilders
Constant Score ConstantScoreQueryBuilder QueryBuilders.constantScoreQuery()
Bool BoolQueryBuilder QueryBuilders.boolQuery()
Dis Max DisMaxQueryBuilder QueryBuilders.disMaxQuery()
Function Score FunctionScoreQueryBuilder QueryBuilders.functionScoreQuery()
Boosting BoostingQueryBuilder QueryBuilders.boostingQuery()

特殊查詢

Wrapper Query

這裏比較重要的一個是 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 列表,可參考此處

參考文檔

  1. elasticsearch High level client Building Queries

系列文章列表

  1. Elasticsearch Java Rest Client API 整理總結 (一)——Document API
  2. Elasticsearch Java Rest Client API 整理總結 (二) —— SearchAPI
  3. Elasticsearch Java Rest Client API 整理總結 (三)——Building Queries
相關文章
相關標籤/搜索