Elasticsearch (簡稱 ES) 作為一款強大的分布式搜索和分析引擎,其核心能力之一就是靈活且高效的查詢功能。
在實際應用中,我們很少只根據單一條件進行搜索,往往需要組合多個查詢條件,例如“查找品牌為 A、價格在 100 到 500 之間、并且包含關鍵詞 B 或 C 的商品”。
這時,Elasticsearch 的 組合查詢 (Composite Queries),尤其是 布爾查詢 (bool
query) 就顯得至關重要。
本文將深入探討 Elasticsearch 組合查詢的核心——bool
查詢的用法、原理及最佳實踐。
什么是組合查詢?為什么需要它?
在 Elasticsearch 中,查詢不僅僅是簡單的匹配。單個查詢子句(Query Clause),如 match
、term
、range
等,通常只關注一個字段或一個特定的條件。然而,現實世界的搜索需求往往是多維度的、復雜的。我們需要一種機制來將這些原子化的查詢條件有機地結合起來,實現更精細化的數據檢索。
組合查詢允許我們:
- 邏輯組合: 實現 AND(與)、OR(或)、NOT(非)等邏輯關系。
-
控制相關性: 區分哪些條件必須滿足,哪些條件可選但能提升相關性得分 (
_score
)。 -
性能優化: 利用特定組合方式(如
filter
上下文)提高查詢效率。
Elasticsearch 提供了多種組合查詢的方式,其中最常用、最強大的就是 bool
查詢。此外,還有 dis_max
(Disjunction Max Query)、constant_score
等,但 bool
查詢是構建復雜邏輯的基礎。
布爾查詢 (bool
Query) 詳解
bool
查詢是 Elasticsearch 中用于組合多個查詢子句的主要方式。它將其他查詢子句(可以是葉子查詢如 match
,也可以是其他的 bool
查詢)包裹起來,并通過不同的邏輯“槽位”(Clauses)來定義它們之間的關系。
一個 bool
查詢的基本結構如下:
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)
- 作用: 數組中的所有查詢子句 都必須 匹配文檔。
- 邏輯等價: AND / 與
-
評分影響: 會 影響文檔的相關性得分 (
_score
)。匹配的must
子句越多(或匹配得越好),得分通常越高。 - 適用場景: 需要嚴格滿足的核心搜索條件,且這些條件本身的相關性很重要。
示例:查找 title
字段包含 "elasticsearch" 并且 status
字段為 "published" 的文檔。