ElasticSearch查詢 第五篇:布爾查詢

来源:http://www.cnblogs.com/ljhdo/archive/2017/04/06/5040252.html
-Advertisement-
Play Games

布爾查詢是最常用的組合查詢,不僅將多個查詢條件組合在一起,並且將查詢的結果和結果的評分組合在一起。當查詢條件是多個表達式的組合時,布爾查詢非常有用,實際上,布爾查詢把多個子查詢組合(combine)成一個布爾表達式,所有子查詢之間的邏輯關係是與(and);只有當一個文檔滿足布爾查詢中的所有子查詢條件... ...


《ElasticSearch查詢》目錄導航:

 

布爾查詢是最常用的組合查詢,不僅將多個查詢條件組合在一起,並且將查詢的結果和結果的評分組合在一起。當查詢條件是多個表達式的組合時,布爾查詢非常有用,實際上,布爾查詢把多個子查詢組合(combine)成一個布爾表達式,所有子查詢之間的邏輯關係是與(and);只有當一個文檔滿足布爾查詢中的所有子查詢條件時,ElasticSearch引擎才認為該文檔滿足查詢條件。布爾查詢支持的子查詢類型共有四種,分別是:must,should,must_not和filter:

  • must子句:文檔必須匹配must查詢條件;
  • should子句:文檔應該匹配should子句查詢的一個或多個;
  • must_not子句:文檔不能匹配該查詢條件;
  • filter子句:過濾器,文檔必須匹配該過濾條件,跟must子句的唯一區別是,filter不影響查詢的score;

通常情況下,should子句是數組欄位,包含多個should子查詢,預設情況下,匹配的文檔必須滿足其中一個子查詢條件。如果查詢需要改變預設匹配行為,查詢DSL必須顯式設置布爾查詢的參數minimum_should_match的值,該參數控制一個文檔必須匹配的should子查詢的數量,例如,對於以下should查詢,一個文檔必須滿足should子句中兩個以上的詞條查詢:

"should" : [
        {  "term" : { "tag" : "azure" } },
        {  "term" : { "tag" : "elasticsearch" } },
        {  "term" : { "tag" : "cloud" } }
    ],
"minimum_should_match" : 2

布爾查詢的各個子句之間的邏輯關係是與(and),這意味著,一個文檔只有同時滿足所有的查詢子句時,該文檔才匹配查詢條件,作為結果返回。

在布爾查詢中,對查詢結果的過濾,建議使用過濾(filter)子句和must_not子句,這兩個子句屬於過濾上下文(Filter Context),經常使用filter子句,使得ElasticSearch引擎自動緩存數據,當再次搜索已經被緩存的數據時,能夠提高查詢性能;由於過濾上下文不影響查詢的評分,而評分計算讓搜索變得複雜,消耗更多CPU資源,因此,filter和must_not查詢減輕搜索的工作負載。

一,查詢和過濾上下文

在布爾查詢中,查詢被分為Query Context 和 Filter Context,查詢上下文由query參數指定,過濾上下文由filter和must_not參數指定。這兩個查詢上下文的唯一區別是:Filter Context不影響查詢的評分(score)。在布爾查詢中,Filter參數和must_not參數使用Filter Context,而must和should使用Query Context,經常使用Filter Context,引擎會自動緩存數據,提高查詢性能。

GET _search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}

對於上述查詢請求,must子句處於query context中,filter子句處於filter context中:

  • 在query context中,must子句將返回同時滿足匹配(match)查詢的文檔;
  • 在filter context中,filter子句是一個過濾器,將不滿足詞條查詢和範圍查詢條件的文檔過濾掉,並且不影響匹配文檔的score;

二,布爾查詢子句的邏輯關係

在布爾查詢中,各個子句之間的邏輯關係是與(and)。對於單個子句,只要一個文檔滿足該子句的查詢條件,返回的邏輯結果就是true,而對於should子句,它一般包含多個子查詢條件,參數 minimum_should_match 控制文檔必須滿足should子句中的子查詢條件的數量,只有當文檔滿足指定數量的should查詢條件時,should子句返回的邏輯結果才是true。

{
    "bool" : {
        "must" : {
            "term" : { "user" : "kimchy" }
        },
        "filter": {
            "term" : { "tag" : "tech" }
        },
        "must_not" : {
            "range" : {
                "age" : { "from" : 10, "to" : 20 }
            }
        },
        "should" : [
            {  "term" : { "tag" : "wow" } },
            {  "term" : { "tag" : "elasticsearch" } }
        ],
        "minimum_should_match" : 1
    }
}

在上述布爾查詢中,should子句中包含兩個詞條查詢,由於參數 minimum_should_match的值是1,因此,只要一個穩定滿足任意一個詞條查詢的條件,should子句就匹配成功,返回邏輯結果true,然後和其他子查詢進行邏輯運算,只有當該文檔滿足所有的子查詢條件時,才作為查詢結果返回到客戶端。

三,布爾查詢示例分析

在下述示例中,分析布爾查詢的運算邏輯:

  • must子句和should子句之間的邏輯關係是and;
  • must子句包含一個匹配查詢,欄位eventname必須包含style詞條;
  • should子句是一個數組,包含兩個匹配查詢,文檔必須匹配的子句查詢條件數量由參數 minimum_should_match控制;
  • 參數 minimum_should_match的值是1,這就意味著,一個文檔只要滿足任意一個查詢子句,就匹配should子句;
{  
   "query":{  
      "bool":{  
         "must":{  
            "match":{  "eventname":"style" }
         },
         "should":[  
            { "match":{ "eventname":"google" } },
            { "match":{  "eventname":"aws" }}
         ],
         "minimum_should_match":1
      }
   }
}

通過上述分析,以下欄位值滿足查詢條件:

  • "eventname": "Google style map"
  • "eventname": "AWS Game Day ~ Seattle Style!"

 

參考文檔:

Elasticsearch Reference [2.4] » Query DSL » Compound queries » Bool Query


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 需求場景 項目中有這麼個需求:統計集群中各個節點的數據量存儲大小,不是記錄數。 一開始有點無頭緒,後面查看cassandra官方文檔看到Monitoring章節,裡面說到:Cassandra中的指標使用Dropwizard Metrics庫進行管理。 這些指標可以通過JMX查詢,也可以使用多個內置和 ...
  • 簡要介紹MySQL Flashback 的原理,安裝和使用。 ...
  • Hive的列除了支持基本的數據類型外,還支持使用Struct、Map和Array三種集合數據類型。 假設某表有如下一行,我們用JSON格式來表示其數據結構。在Hive下訪問的格式為 { "name": "John Doe", "salary": 100000.0 , "subordinates": ... ...
  • 1、應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 2、對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 3、應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引 ...
  • 用管理員身份cmd進入mysql安裝目錄bin里,執行 如果殺毒軟體攔截,添加為信任區 ...
  • 執行資料庫查詢時,有完整查詢和模糊查詢之分。 一般模糊語句格式如下: SELECT 欄位 FROM 表 WHERE 某欄位 LIKE 條件 其中關於條件,SQL提供了四種匹配模式: 1、% :表示任意0個或多個字元。可匹配任意類型和長度的字元,有些情況下若是中文,請使用兩個百分號(%%)表示。 例如 ...
  • 1、選取最適用的欄位屬性 MySQL可以很好的支持大數據量的存取,但是一般說來,資料庫中的表越小,在它上面執行的查詢也就會越快。因此,在創建表的時候,為了獲得更好的性能,我們可以將表中欄位的寬度設得儘可能小。 例如,在定義郵政編碼這個欄位時,如果將其設置為CHAR(255),顯然給資料庫增加了不必要 ...
  • 啟動該隨筆的原因,個人因為辭職較多空檔期,故本著重新學習的動力以及為了記錄自己學習 開始學習一些概念性的東西吧(PS:博主,PHP開發 一枚) Data 數據 :經過語義解釋的值 Database(DB) 資料庫 :數據的倉庫 Database Management System(DBMS) 資料庫 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...