Elasticsearch 7 复合查询详解

在使用 **Elasticsearch 7** 进行数据检索时,复合查询(`bool query`)是最常用、最强大的查询方式之一。它允许我们将多个子查询组合在一起,按照布尔逻辑进行筛选和匹配,从而实现更复杂的搜索需求。

#### 一、什么是复合查询?

复合查询(`bool query`)是一种基于布尔逻辑的查询结构,可以将多个查询条件组合起来,包括 `must`、`should`、`must_not` 和 `filter` 四种类型。每种类型代表不同的匹配规则:

| 类型 | 含义说明 |
|————|———-|
| `must` | 所有在 `must` 中的子查询都必须匹配,相当于逻辑与(AND) |
| `should` | 至少有一个在 `should` 中的子查询匹配,相当于逻辑或(OR),也可以通过 `minimum_should_match` 设置匹配数量 |
| `must_not` | 子查询中不能有任何一个匹配,相当于逻辑非(NOT) |
| `filter` | 与 `must` 类似,但不计算相关性得分,适合用于精确值过滤 |

#### 二、基本语法示例

以下是一个典型的复合查询示例:

“`json
{
“query”: {
“bool”: {
“must”: [
{ “match”: { “title”: “elasticsearch” } }
],
“should”: [
{ “term”: { “category”: “database” } },
{ “range”: { “price”: { “gte”: 100, “lte”: 200 } } }
],
“must_not”: [
{ “term”: { “status”: “out_of_stock” } }
],
“filter”: [
{ “range”: { “publish_date”: { “gte”: “2023-01-01” } } }
]
}
}
}
“`

这个查询表示:

– 必须包含关键词 “elasticsearch” 在标题中;
– 分类是 “database” 或者价格在 100 到 200 之间;
– 不处于 “out_of_stock” 状态;
– 发布时间在 2023 年之后。

#### 三、`filter` 与 `must` 的区别

虽然 `filter` 和 `must` 都要求文档满足条件,但它们之间存在重要区别:

– `must` 条件会参与评分(scoring),即影响文档的相关度得分;
– `filter` 条件不会参与评分,仅用于过滤文档,效率更高,适合用于范围查询、状态过滤等不需要评分的场景。

#### 四、`minimum_should_match` 参数

当使用 `should` 子句时,可以通过 `minimum_should_match` 指定至少匹配几个条件。例如:

“`json
{
“query”: {
“bool”: {
“should”: [
{ “term”: { “tag”: “java” }},
{ “term”: { “tag”: “python” }},
{ “term”: { “tag”: “javascript” }}
],
“minimum_should_match”: 2
}
}
}
“`

上述查询要求文档必须包含至少两个标签。

#### 五、嵌套复合查询

`bool` 查询还可以嵌套使用,以构建更复杂的逻辑结构。例如:

“`json
{
“query”: {
“bool”: {
“must”: [
{ “match”: { “title”: “elasticsearch” } }
],
“should”: [
{
“bool”: {
“must”: [
{ “term”: { “category”: “tutorial” } },
{ “range”: { “views”: { “gte”: 1000 } } }
]
}
},
{
“bool”: {
“must_not”: [
{ “term”: { “status”: “draft” } }
]
}
}
]
}
}
}
“`

该查询表示:标题必须包含“elasticsearch”,并且满足以下两个条件中的任意一个:

1. 分类为 tutorial 且浏览量大于等于 1000;
2. 状态不是 draft。

#### 六、总结

Elasticsearch 的复合查询(`bool query`)是构建复杂查询的核心工具。通过灵活使用 `must`、`should`、`must_not` 和 `filter`,我们可以实现各种高级搜索功能,如多条件组合、精确过滤、模糊匹配等。掌握 `bool` 查询的使用技巧,对于开发高性能、高准确率的搜索系统至关重要。

相关文章