Elasticsearch 的 bool 查询如何组合多个查询条件来影响评分?

Sherwin.Wei Lv8

Elasticsearch 的 bool 查询如何组合多个查询条件来影响评分?

回答重点

在 Elasticsearch 中,你可以使用 bool 查询来组合多个查询条件,同时影响文档的评分(relevance score)。bool 查询包含四种子句(clauses):must、filter、should 和 must_not。

  1. must:文档必须匹配这些条件,用于打分。
  2. filter:文档必须匹配这些条件,但不影响打分。
  3. should:文档中的一个或多个应该匹配这些条件。如果存在 must 子句,应该子句至少匹配一个;如果 must 子句不存在,至少匹配 should 子句中的一个以视为匹配。
  4. must_not:文档必须不匹配这些条件,不参与评分。

通过组合这些子句,你可以非常灵活地构建复杂的查询,并精细控制哪些因素影响文档的评分。

扩展知识

  1. must 子句:它们是核心评分组件。某个条件放在 must 子句中,文档必须匹配该条件,且其相关性会影响最终评分。比如,你想搜索特定关键词的文章,并且这些关键词出现在文章标题中,必须纳入 must 子句。

  2. filter 子句:常用于缓存且性能高,因为它不计算分数。适合用于那些确定性高且不会过度变化的条件,比如时间范围、状态等。举个例子,如果你希望查询匹配某时间段内的所有记录,这个条件就非常适合作为 filter 子句,提升查询效率。

  3. should 子句:用于可选的条件,但这些条件真的很重要时,加上 minimum_should_match 参数,也是可以强制性使其至少匹配一些。一个典型的例子是,你希望搜索相关文章,但更希望那些包含特定关键字的文章获得更高的评分,但即使没有这些关键字也要返回结果。

  4. must_not 子句:用于排除文档。比如你搜索某类型产品,但是不希望返回特定品牌,这时候 must_not 子句就非常适合。

进一步讲,bool 查询还可以嵌套其他 bool 查询,以支持更加复杂的查询逻辑。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"should": [
{ "match": { "tags": "search engine" } },
{ "match": { "tags": "distributed" } }
],
"filter": [
{ "range": { "date": { "gte": "now-1y/d" } } }
],
"must_not": [
{ "match": { "author": "anonymous" } }
]
}
}
}

这个示例展示了 搜索包含 “Elasticsearch” 的文档,优先显示包含 “search engine” 或 “distributed” 标签的文档,且文档时间在过去一年以内,同时排除匿名作者的文档。这样的灵活性使得 bool 查询变得十分强大。

Comments
On this page
Elasticsearch 的 bool 查询如何组合多个查询条件来影响评分?