15 查询与过滤之过滤器

在上一篇中,我们深入探讨了复合查询的使用方法和应用场景,了解了如何通过 mustshouldmust_not 组合构建复杂的查询条件。在本篇中,我们将重点关注 过滤器,这是一种高效的数据筛选方式,通常用于对已知条件进行精确过滤。

什么是过滤器?

在 Elasticsearch 中,过滤器 是一种用于选择数据的机制,它并不关心相关性分数,而是关注是否匹配。在执行过滤时,Elasticsearch 不会进行评分计算,这使得过滤器的性能通常比查询更高,尤其是在大型数据集中的应用。

过滤器常用于开放性查询场景后、执行特定的条件过滤。其主要优点包括:

  • 高性能:不需要计算相关性评分。
  • 缓存:过滤器的结果可以被缓存,以提高后续相同查询的效率。

过滤器的类型

Elasticsearch 提供了多种类型的过滤器,以下是一些常见的过滤器类型:

  1. Term Filter:用于精确匹配某个字段的值。
  2. Range Filter:用于指定某个字段的值范围。
  3. Exists Filter:用于检查字段是否存在。
  4. Bool Filter:用于组合多个过滤器。

接下来,我们将结合代码示例,详细讲解这些过滤器的使用。

Term Filter 示例

假设我们有一个关于书籍的索引,每本书都有 titleauthor 字段。我们想要返回所有 author 为 “John Doe” 的书籍。

1
2
3
4
5
6
7
8
9
10
11
12
GET /books/_search
{
"query": {
"bool": {
"filter": {
"term": {
"author": "John Doe"
}
}
}
}
}

在这个查询中,我们使用了 bool 查询的 filter 部分来嵌套 term 过滤器。查询结果将返回所有作者是 “John Doe” 的书籍,而不需要计算相关性评分。

Range Filter 示例

如果我们想要查找在特定发布年份内的书籍,比如在 2010 年到 2020 年之间,我们可以使用 range 过滤器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET /books/_search
{
"query": {
"bool": {
"filter": {
"range": {
"published_year": {
"gte": 2010,
"lte": 2020
}
}
}
}
}
}

在这个示例中,range 过滤器用于定义年份范围,从 2010 年(包含)到 2020 年(包含)。所有发布年份在此范围内的书籍将被返回。

Exists Filter 示例

如果我们要查找所有存在 summary 字段的书籍,可以使用 exists 过滤器:

1
2
3
4
5
6
7
8
9
10
11
12
GET /books/_search
{
"query": {
"bool": {
"filter": {
"exists": {
"field": "summary"
}
}
}
}
}

这里,exists 过滤器能够确保返回的书籍拥有 summary 字段。

Bool Filter 示例

bool 过滤器允许我们将多个过滤器组合在一起。例如,我们希望返回在指定年份内,并且作者为 “John Doe” 的书籍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
GET /books/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"author": "John Doe"
}
},
{
"range": {
"published_year": {
"gte": 2010,
"lte": 2020
}
}
}
]
}
}
}

这个查询同时应用了 termrange 过滤器,只有满足这两个条件的书籍才会被返回。

结语

在本篇教程中,我们系统地介绍了 过滤器 的概念和多种类型,结合多个示例展示了如何使用过滤器来精确筛选数据。过滤器 配合复合查询,将极大增加你的搜索引擎的灵活性和性能。

在下一篇教程中,我们将深入探讨聚合与分析,了解如何利用聚合功能来对数据进行分析和汇总。希望您保持关注!

15 查询与过滤之过滤器

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

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论