14 查询与过滤之复合查询

在上一篇文章中,我们介绍了 Elasticsearch 的基本查询,学习了如何使用简单的查询语句来从索引中获取数据。在本篇文章中,我们将深入探讨复合查询(Compound Queries),这些查询类型允许我们将多个查询条件结合在一起,从而实现更复杂的搜索需求。同时,我们将为您提供相关的案例和代码示例,以帮助您更好地理解这些概念。

什么是复合查询?

复合查询是在 Elasticsearch 中将多个查询组合在一起的查询方式。通过复合查询,您可以借助诸如 booldis_maxfunction_score 等查询,来更精细地控制搜索逻辑。这种查询方式非常灵活,能够满足复杂的搜索需求。

1. bool 查询

bool 查询是复合查询的核心,通过它您可以容易地组合多个查询条件。bool 查询支持以下几个主要的子句:

  • must:必须匹配的查询条件。
  • should:可选的匹配条件,至少有一个需要匹配。
  • must_not:必须不匹配的查询条件。
  • filter:过滤条件,表现为开销低但不会影响评分。

示例

假设我们有一个包含图书信息的索引,每本书都有标题、作者和出版年份。以下是一个使用 bool 查询的示例,我们想找到“编程”一词出现在标题中的书籍,同时出版年份在 2010 年以后,并且由“作者A”或“作者B”撰写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
POST /books/_search
{
"query": {
"bool": {
"must": {
"match": {
"title": "编程"
}
},
"filter": [
{
"range": {
"publication_year": {
"gt": 2010
}
}
},
{
"terms": {
"author": ["作者A", "作者B"]
}
}
]
}
}
}

在这个查询中:

  • must 子句确保标题中必须包含“编程”。
  • filter 子句结合 rangeterms 查询来进行过滤,确保获取的书籍出版年份在 2010 年以后,并且作者是“作者A”或“作者B”。

2. dis_max 查询

dis_max 查询的作用是让您在多个查询中选择命中度最高的结果。也就是说,如果多个查询条件匹配,则使用最佳匹配的分数。

示例

如果我们希望找到同时包含“编程”和“数据”的书籍,但更关注“编程”这一关键词,代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
POST /books/_search
{
"query": {
"dis_max": {
"queries": [
{
"match": {
"title": "编程"
}
},
{
"match": {
"description": "数据"
}
}
],
"tie_breaker": 0.3
}
}
}

在这个查询中,dis_max 查询从 title 和 description 字段中查找,并返回匹配度最高的结果。tie_breaker 参数用于调节不同查询的影响力。

3. function_score 查询

function_score 查询允许您在查询结果中动态调整每个文档的分数。这一功能极其强大,适用于在搜索结果中加权某些条件。

示例

假设我们想要提升某些图书(如获取最多好评的书籍)的得分,我们可以使用 function_score 查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
POST /books/_search
{
"query": {
"function_score": {
"query": {
"match": {
"title": "编程"
}
},
"functions": [
{
"filter": {
"term": {
"rating": "5"
}
},
"weight": 2
}
],
"boost_mode": "multiply"
}
}
}

在这个示例中:

  • 我们首先查找包含“编程”的书籍。
  • 通过 functionsfilter,我们针对评分为 5 星的书籍加权,提升它们在最终搜索结果中的排名。

总结

在本篇中,我们探讨了 Elasticsearch 的复合查询,主要包括 booldis_maxfunction_score 查询。这些查询类型为您提供了强大的工具,能够灵活地构建复杂的搜索逻辑。因此,在实际应用中,根据需求选择合适的复合查询可以大大提升搜索的有效性。

下一篇文章将会深入讨论 Elasitcsearch 中的过滤器,您将会了解如何高效地处理从结果集中排除某些文档,以及相关的最佳实践。希望您能继续关注我们的系列教程,深入学习 Elasticsearch 的强大功能!

14 查询与过滤之复合查询

https://zglg.work/elasticsearch-zero/14/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论