bool 组合查询|Elasticsearch 七日笔记 08
本文沿用上一篇准备的 users 数据(Alice Smith 25、Bob Jones 30、Charlie Brown 28、Alice Lee 22)。
定义与作用
组合查询通过 bool 查询实现多条件搜索,支持逻辑运算,提升查询的精确性和复杂性。
- 作用:
- 组合多个查询条件(如“名字含 Alice 且年龄为 25”)。
- REST API:
- 在
_search中使用bool。
- 在
bool 查询结构
- 子句:
must:必须满足(逻辑与,AND)。should:至少满足一个(逻辑或,OR)。filter:必须满足但不计算得分。must_not:必须不满足(逻辑非,NOT)。
- 示例:
GET /users/_search { "query": { "bool": { "must": [ {"match": {"name": "Alice"}} ], "filter": [ {"term": {"age": 25}} ] } } }- 返回:
name含“Alice”且age为 25 的文档。
- 返回:
子句详解
must:- 所有条件必须匹配,影响相关性得分。
- 示例:
name含“Alice”且“Smith”。
should:- 至少满足一个条件,可设置
minimum_should_match。 - 示例:
"should": [ {"match": {"name": "Bob"}}, {"match": {"name": "Charlie"}} ], "minimum_should_match": 1
- 至少满足一个条件,可设置
filter:- 必须匹配但不计算得分,性能更高。
- 示例:筛选
age为 25。
must_not:- 排除符合条件的文档。
- 示例:排除
age为 30。
filter 的优势
- 不计算得分:
- 减少计算开销,查询更快。
- 缓存:
- 结果可被 ES 缓存,提升重复查询性能。
- 适用场景:
- 结构化筛选(如年龄范围、状态)。
动手实践:组合查询
目标
- 使用
bool查询实现多条件搜索。
步骤
- 搜索“Alice”且年龄 25:
- 运行:
GET /users/_search { "query": { "bool": { "must": [ {"match": {"name": "Alice"}} ], "filter": [ {"term": {"age": 25}} ] } } } - 预期:返回 ID 为 1 的文档(Alice Smith)。
- 运行:
- 搜索年龄大于 20 的 Bob 或 Charlie:
- 运行:
GET /users/_search { "query": { "bool": { "should": [ {"match": {"name": "Bob"}}, {"match": {"name": "Charlie"}} ], "filter": [ {"range": {"age": {"gt": 20}}} ] } } } - 预期:返回 ID 为 2 和 3 的文档(Bob Jones 和 Charlie Brown)。
- 运行:
- 验证:
- 检查返回结果,理解
must和should的逻辑。
- 检查返回结果,理解
注意事项
filter不影响_score,适合性能优化。should默认无需全匹配,可加minimum_should_match。
关键点
bool查询:must(与)、should(或)、filter(性能优化)、must_not(非)。
学习建议
- 动手实践:
- 尝试不同查询组合(如
must+must_not)。 - 用
match_all查询所有数据,观察结果结构。
- 尝试不同查询组合(如
- 笔记记录:
- 画出
bool查询的逻辑关系图。
- 画出
本文是《Elasticsearch 七日笔记》系列的第 8 篇,对应第 3 天的学习内容。
