Elasticsearch 复杂查询详解:复合查询与逻辑组合
在 Elasticsearch 中,复杂查询通过组合多个简单查询条件,实现精准的数据过滤和相关性排序。核心复合查询包括 bool(布尔逻辑)、dis_max(取最大值)和 boosting(评分调整)等,适用于多条件组合、多字段匹配等场景。
bool 查询:布尔逻辑组合
bool 查询是最常用的复合查询,通过 must、filter、should、must_not 四个子句组合多个查询条件,实现类似 AND、OR、NOT 的逻辑关系。
核心子句说明
| 子句 | 作用 | 是否影响评分 | 类比逻辑 |
|---|---|---|---|
must |
必须匹配的条件(所有条件都满足) | 是 | AND |
filter |
必须匹配的条件(与 must 功能相同,但不参与评分) |
否 | AND |
should |
可选匹配的条件(至少满足一个,除非有 must/filter 子句) |
是 | OR |
must_not |
必须不匹配的条件(排除符合条件的文档) | 否 | NOT |
配置参数
minimum_should_match:指定should子句中至少需要匹配的条件数量(默认:当存在must/filter时为 0,否则为 1)。boost:为整个bool查询设置权重(默认 1.0)。
示例:多条件组合查询
1 | GET products/_search |
关键特性
filter子句的结果会被缓存,适合频繁执行的过滤条件(如状态、时间范围),性能优于must。- 支持嵌套
bool查询(如在should中嵌套另一个bool),实现复杂逻辑。
dis_max 查询:取多个查询的最高分
dis_max(Disjunction Max)查询用于执行多个子查询,取其中得分最高的作为文档的最终得分,适合多字段匹配但希望突出最佳匹配的场景(如搜索标题和内容,以匹配度最高的字段为准)。
核心参数
queries:待执行的子查询列表(数组形式)。tie_breaker:打破平局的因子(0~1 之间),用于将其他子查询的得分按比例叠加到最高分上(默认 0.0,即只取最高分)。boost:为整个查询设置权重(默认 1.0)。
示例:多字段最佳匹配
1 | GET articles/_search |
得分计算逻辑:
假设标题匹配得分为 1.5,内容匹配得分为 0.8,则最终得分为:1.5 + (0.8 × 0.3) = 1.74
适用场景
- 多字段搜索(如标题、摘要、正文),希望优先展示在某个字段上高度匹配的文档。
- 避免因多个字段低匹配度叠加导致的 “伪相关” 结果。
boosting 查询:降级匹配文档的得分
boosting 查询用于 “包含但降级” 某些文档 —— 即保留符合特定条件的文档,但降低其相关性得分,而不是完全排除。
核心参数
positive:必须匹配的主查询(得分正常计算)。negative:需要降级的辅助查询(匹配的文档得分会被降低)。negative_boost:降级系数(0~1 之间),匹配negative的文档得分会乘以该系数。
示例:保留但降级特定文档
1 | GET books/_search |
效果:
- 所有标题含 “机器学习” 的文档都会被返回。
- 其中内容含 “入门” 的文档得分会降低(变为原来的 50%),在结果中排序靠后。
适用场景
- 过滤 “相关但质量较低” 的文档(如搜索 “深度学习” 时,降级包含 “入门”“基础” 的文档)。
- 需保留所有相关结果,但希望优先展示更符合核心需求的文档。
复合查询的嵌套与组合
复杂业务场景往往需要嵌套多种复合查询,例如在 bool 的 should 中嵌套 dis_max,或在 filter 中嵌套 bool。
示例:嵌套查询
1 | GET orders/_search |
v1.3.10