1. 程式人生 > >Elasticsearch Java Rest Client API 整理總結 (三)——Building Queries

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

art ear tex 基於 nts 做了 可用 per 匹配

目錄

  • 上篇回顧
  • Building Queries
    • 匹配所有的查詢
    • 全文查詢 Full Text Queries
      • 什麽是全文查詢?
      • Match
      • 全文查詢 API 列表
    • 基於詞項的查詢
      • Term
      • Terms
      • Wildcard
      • 基於詞項 API 列表
    • 復合查詢
      • 什麽是復合查詢?
      • 復合查詢列表
    • 特殊查詢
      • Wrapper Query
  • 小結
  • 參考文檔
  • 系列文章列表

上篇回顧

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

技術分享圖片

由上圖看出, QueryBuilder 是整個查詢操作的核心,決定了查詢什麽樣的數據和期望得到什麽結果這些核心的問題。

QueryBuilder 只是一個接口,需要具體的實體類才可以。那麽如何創建 QueryBuilder 的實例呢?有兩種方式

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

Building Queries

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

匹配所有的查詢

查詢語句如下

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

對應的 QueryBuilder Class 為 MatchAllQueryBuilder

具體方法為 QueryBuilders.matchAllQuery()

全文查詢 Full Text Queries

什麽是全文查詢?

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

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

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

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

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