Elasticsearch (簡稱 ES) 作為一款強大的分布式搜索和分析引擎,其核心能力之一就是靈活且高效的查詢功能。
在實際應用中,我們很少只根據(jù)單一條件進行搜索,往往需要組合多個查詢條件,例如“查找品牌為 A、價格在 100 到 500 之間、并且包含關鍵詞 B 或 C 的商品”。
這時,Elasticsearch 的 組合查詢 (Composite Queries),尤其是 布爾查詢 (bool query) 就顯得至關重要。
本文將深入探討 Elasticsearch 組合查詢的核心——bool 查詢的用法、原理及最佳實踐。
什么是組合查詢?為什么需要它?
在 Elasticsearch 中,查詢不僅僅是簡單的匹配。單個查詢子句(Query Clause),如 match、term、range 等,通常只關注一個字段或一個特定的條件。然而,現(xiàn)實世界的搜索需求往往是多維度的、復雜的。我們需要一種機制來將這些原子化的查詢條件有機地結(jié)合起來,實現(xiàn)更精細化的數(shù)據(jù)檢索。
組合查詢允許我們:
- 邏輯組合: 實現(xiàn) AND(與)、OR(或)、NOT(非)等邏輯關系。
-
控制相關性: 區(qū)分哪些條件必須滿足,哪些條件可選但能提升相關性得分 (
_score)。 -
性能優(yōu)化: 利用特定組合方式(如
filter上下文)提高查詢效率。
Elasticsearch 提供了多種組合查詢的方式,其中最常用、最強大的就是 bool 查詢。此外,還有 dis_max (Disjunction Max Query)、constant_score 等,但 bool 查詢是構(gòu)建復雜邏輯的基礎。

布爾查詢 (bool Query) 詳解
bool 查詢是 Elasticsearch 中用于組合多個查詢子句的主要方式。它將其他查詢子句(可以是葉子查詢?nèi)?match,也可以是其他的 bool 查詢)包裹起來,并通過不同的邏輯“槽位”(Clauses)來定義它們之間的關系。
一個 bool 查詢的基本結(jié)構(gòu)如下:
GET /_search
{
"query": {
"bool": {
"must": [ ... ],
"filter": [ ... ],
"should": [ ... ],
"must_not": [ ... ],
"minimum_should_match": 1, // 可選
"boost": 1.0 // 可選
}
}
}
bool 查詢包含四個主要的子句類型:must、filter、should、must_not。下面我們逐一解析。
1. must 子句:必須匹配 (AND)
- 作用: 數(shù)組中的所有查詢子句 都必須 匹配文檔。
- 邏輯等價: AND / 與
-
評分影響: 會 影響文檔的相關性得分 (
_score)。匹配的must子句越多(或匹配得越好),得分通常越高。 - 適用場景: 需要嚴格滿足的核心搜索條件,且這些條件本身的相關性很重要。
示例:查找 title 字段包含 "elasticsearch" 并且 status 字段為 "published" 的文檔。