14 查询与过滤之复合查询
在上一篇文章中,我们介绍了 Elasticsearch 的基本查询,学习了如何使用简单的查询语句来从索引中获取数据。在本篇文章中,我们将深入探讨复合查询(Compound Queries),这些查询类型允许我们将多个查询条件结合在一起,从而实现更复杂的搜索需求。同时,我们将为您提供相关的案例和代码示例,以帮助您更好地理解这些概念。
什么是复合查询?
复合查询是在 Elasticsearch 中将多个查询组合在一起的查询方式。通过复合查询,您可以借助诸如 bool
、dis_max
、function_score
等查询,来更精细地控制搜索逻辑。这种查询方式非常灵活,能够满足复杂的搜索需求。
1. bool
查询
bool
查询是复合查询的核心,通过它您可以容易地组合多个查询条件。bool
查询支持以下几个主要的子句:
must
:必须匹配的查询条件。should
:可选的匹配条件,至少有一个需要匹配。must_not
:必须不匹配的查询条件。filter
:过滤条件,表现为开销低但不会影响评分。
示例
假设我们有一个包含图书信息的索引,每本书都有标题、作者和出版年份。以下是一个使用 bool
查询的示例,我们想找到“编程”一词出现在标题中的书籍,同时出版年份在 2010 年以后,并且由“作者A”或“作者B”撰写。
1 | POST /books/_search |
在这个查询中:
must
子句确保标题中必须包含“编程”。filter
子句结合range
和terms
查询来进行过滤,确保获取的书籍出版年份在 2010 年以后,并且作者是“作者A”或“作者B”。
2. dis_max
查询
dis_max
查询的作用是让您在多个查询中选择命中度最高的结果。也就是说,如果多个查询条件匹配,则使用最佳匹配的分数。
示例
如果我们希望找到同时包含“编程”和“数据”的书籍,但更关注“编程”这一关键词,代码示例如下:
1 | POST /books/_search |
在这个查询中,dis_max
查询从 title 和 description 字段中查找,并返回匹配度最高的结果。tie_breaker
参数用于调节不同查询的影响力。
3. function_score
查询
function_score
查询允许您在查询结果中动态调整每个文档的分数。这一功能极其强大,适用于在搜索结果中加权某些条件。
示例
假设我们想要提升某些图书(如获取最多好评的书籍)的得分,我们可以使用 function_score
查询:
1 | POST /books/_search |
在这个示例中:
- 我们首先查找包含“编程”的书籍。
- 通过
functions
和filter
,我们针对评分为 5 星的书籍加权,提升它们在最终搜索结果中的排名。
总结
在本篇中,我们探讨了 Elasticsearch 的复合查询,主要包括 bool
、dis_max
和 function_score
查询。这些查询类型为您提供了强大的工具,能够灵活地构建复杂的搜索逻辑。因此,在实际应用中,根据需求选择合适的复合查询可以大大提升搜索的有效性。
下一篇文章将会深入讨论 Elasitcsearch 中的过滤器,您将会了解如何高效地处理从结果集中排除某些文档,以及相关的最佳实践。希望您能继续关注我们的系列教程,深入学习 Elasticsearch 的强大功能!
14 查询与过滤之复合查询