如何使用BoolQueryBuilder實現高效的查詢篩選

在ES(ElasticSearch)搜索引擎中,BoolQueryBuilder是一種非常有用的查詢構建器,可以快速而準確地構建複雜的查詢篩選條件,以實現高效的搜索。在本文中,將介紹如何使用BoolQueryBuilder來建立搜索查詢。

一、基本概念

在開始之前,讓我們來了解一些基本概念。在ES中,查詢分為兩個大類:一是結構化查詢,二是全文查詢。BoolQueryBuilder屬於結構化查詢構建器,用以編寫比較複雜和結構化的搜索查詢。它可以使用should、must、must_not以及filter等子句進行查詢構建和組合,從而達到滿足我們需求的目的。

其中,must表示必須匹配,should表示可以匹配,must_not表示不能匹配,filter表示過濾。比如,查詢詞語chocolate cake,我們可以這樣構建查詢子句:should加入chocolate和cake兩個詞語,使它們之間是or的關係,意味着這個文檔只要匹配了其中一個詞語就算作匹配成功。如果加上must,這就變成了and的關係,必須同時匹配成功才算匹配上。

二、語法格式

下面來看一下bool查詢的語法格式。它支持的查詢語句有must、must_not、should和filter。其中,filter用於過濾查詢,不參與評分(_score),因此相比其他查詢更加快速,適用於篩選數據。

{
    "bool": {
        "must": [
            { "match": { "title":   "word1"        }},
            { "match": { "content": "word2 word3"  }}
        ],
        "must_not": [
            { "match": { "title": "word4" }}
        ],
        "should": [
            { "match": { "title": "word5" }},
            { "match": { "content": "word6" }}
        ],
        "filter": [
            { "term":  { "status": true }},
            { "range": { "publish_date": { "gte": "2015-01-01" }}}
        ]
    }
}

上面是一段bool查詢的例子。可以看到,must、must_not、should和filter中的每一個都是由一組查詢語句組成的數組。這些數組中的語句可以是任何有效的查詢類型,如match、term、range等。注意,如果一個查詢語句是包含多個關鍵詞,需要使用match語句。

三、示例代碼

下面通過一個示例代碼來演示如何使用BoolQueryBuilder。假設我們要查詢狀態為published、類型為article、包含word1和word2中任意一個的文章,並按照發布時間倒序排序。代碼如下:

SearchResponse response = client.prepareSearch("myindex")
        .setTypes("mytype")
        .setQuery(QueryBuilders.boolQuery()
                .must(QueryBuilders.termQuery("status", "published"))
                .must(QueryBuilders.termQuery("type", "article"))
                .should(QueryBuilders.matchQuery("title", "word1"))
                .should(QueryBuilders.matchQuery("title", "word2"))
                .should(QueryBuilders.matchQuery("content", "word1"))
                .should(QueryBuilders.matchQuery("content", "word2"))
                .minimumShouldMatch(1)
                .filter(QueryBuilders.rangeQuery("publish_date")
                        .from("2010-01-01")
                        .to("2021-12-31")))
        .addSort("publish_date", SortOrder.DESC)
        .execute()
        .actionGet();

代碼解析:

首先,我們使用prepareSearch方法來構建SearchRequestBuilder,設置所要查詢的索引和類型。然後,我們使用boolQuery方法來創建一個BoolQueryBuilder對象,用於創建查詢條件。在boolQuery中,我們添加多個不同類型的QueryBuilder查詢子句,使用must表示必須匹配,should表示可以匹配,minimumShouldMatch表示至少匹配一個詞語才算匹配成功,filter表示過濾條件。

最後,我們使用addSort方法來添加排序條件,按發布日期倒序排列。最後,我們使用execute方法對查詢進行執行,並得到查詢結果。

四、總結

通過本篇文章,我們了解了什麼是BoolQueryBuilder,介紹了bool查詢的語法格式,同時還演示了如何使用BoolQueryBuilder來構建查詢條件以及執行查詢操作。

總之,在使用BoolQueryBuilder時,要清楚自己所需要的查詢條件,按照需求使用must、must_not、should和filter等查詢語句進行組合。這樣能夠大大提高搜索的準確性和效率,提高系統的性能和用戶滿意度。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/311993.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-05 16:05
下一篇 2025-01-05 16:05

相關推薦

  • 如何使用Python獲取某一行

    您可能經常會遇到需要處理文本文件數據的情況,在這種情況下,我們需要從文本文件中獲取特定一行的數據並對其進行處理。Python提供了許多方法來讀取和處理文本文件中的數據,而在本文中,…

    編程 2025-04-29
  • 如何使用jumpserver調用遠程桌面

    本文將介紹如何使用jumpserver實現遠程桌面功能 一、安裝jumpserver 首先我們需要安裝並配置jumpserver。 $ wget -O /etc/yum.repos…

    編程 2025-04-29
  • 如何使用Python讀取CSV數據

    在數據分析、數據挖掘和機器學習等領域,CSV文件是一種非常常見的文件格式。Python作為一種廣泛使用的編程語言,也提供了方便易用的CSV讀取庫。本文將介紹如何使用Python讀取…

    編程 2025-04-29
  • Hibernate註解聯合主鍵 如何使用

    解答:Hibernate的註解方式可以用來定義聯合主鍵,使用@Embeddable和@EmbeddedId註解。 一、@Embeddable和@EmbeddedId註解 在Hibe…

    編程 2025-04-29
  • 如何使用random生成不重複的隨機數

    在編程開發中,我們經常需要使用隨機數來模擬一些場景或生成一些數據。但是如果隨機數重複,就會造成數據的不準確性。這時我們就需要使用random庫來生成不重複且隨機的數值。下面將從幾個…

    編程 2025-04-29
  • 如何使用HTML修改layui內部樣式影響全局

    如果您想要使用layui來構建一個美觀的網站或應用,您可能需要使用一些自定義CSS來修改layui內部組件的樣式。然而,修改layui組件的樣式可能會對整個頁面產生影響,甚至可能破…

    編程 2025-04-29
  • 如何使用GPU加速運行Python程序——以CSDN為中心

    GPU的強大性能是眾所周知的。而隨着深度學習和機器學習的發展,越來越多的Python開發者將GPU應用於深度學習模型的訓練過程中,提高了模型訓練效率。在本文中,我們將介紹如何使用G…

    編程 2025-04-29
  • 理解agentmain方法如何使用

    如果你不清楚如何使用agentmain方法,那麼這篇文章將會為你提供全面的指導。 一、什麼是agentmain方法 在Java SE 5.0中,Java提供了一個機制,允許程序員在…

    編程 2025-04-29
  • 如何使用Python導入Random庫

    Python是一門優秀的編程語言,它擁有豐富的第三方庫和模塊。其中,Random庫可謂是最常用的庫之一,它提供了用於生成隨機數的功能。對於開發人員而言,使用Random庫能夠提高開…

    編程 2025-04-29
  • 如何使用Python將print輸出到界面?

    在Python中,print是最常用的調試技巧之一。在編寫代碼時,您可能需要在屏幕上輸出一些值、字符串或結果,以便您可以更好地理解並調試代碼。因此,在Python中將print輸出…

    編程 2025-04-29

發表回復

登錄後才能評論