文章目录
1,filter简介
在Elasticsearch中,布尔查询(Boolean Query)除了包含must
、must_not
和should
子句之外,还有一个重要的子句叫做filter
。
filter
子句在布尔查询中扮演着过滤的角色,用于指定文档必须满足的条件,在语义上,和must
非常相近,但与must
不同的是,filter
子句不会影响文档的相关性得分(_score
)。
以下是filter
子句的一些关键特点:
- 过滤作用 :
filter
子句用于过滤结果,确保返回的文档集合满足特定的条件。 - 不计分 :与
must
不同,filter
子句不会对文档的得分产生影响。这意味着即使文档满足filter
条件,也不会提高其在搜索结果中的排名。 - 缓存 :
filter
子句通常可以利用Elasticsearch的缓存机制,这可以提高查询性能,尤其是对于大数据集。 - 组合使用 :
filter
子句可以与其他子句(如must
、must_not
和should
)结合使用,以构建更复杂的查询。
filter
子句可以包含多种类型的查询,例如:
term
:用于精确匹配字段值。terms
:用于匹配字段值的多个可能选项。range
:用于匹配数值或日期字段的某个范围内的值。exists
:检查字段是否存在于文档中。bool
:嵌套的布尔查询,用于组合多个过滤条件。
2,代码实战
下面是一个包含filter
子句的布尔查询示例:
dart
GET bank/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"gender": "M"
}
},
{
"match": {
"address": "mill"
}
}
],
"must_not": [
{
"match": {
"age": "18"
}
}
],
"should": [
{
"match": {
"lastname": "Wallace"
}
}
],
"filter": [
{
"range": {
"age": {
"gte": 20,
"lte": 30
}
}
}
],
"minimum_should_match": 1
}
}
}
这个布尔查询(Boolean Query),其中包含must
、must_not
、should
和filter
子句。
-
GET bank/_search
:这是一个HTTP GET请求,用于在Elasticsearch的bank
索引中执行搜索。 -
query
:定义了搜索的具体条件。 -
bool
:布尔查询,用于组合不同类型的子查询。-
must
:必须满足的条件。文档必须满足must
中的所有条件才会被包含在搜索结果中。- 性别(gender)必须是"M"。
- 地址(address)必须是"mill"。
-
must_not
:必须不满足的条件。如果文档满足must_not
中的任何条件,它将不会被包含在搜索结果中。- 年龄(age)不能是18岁。
-
should
:可选条件,用于提高满足条件的文档的相关性得分,但不是必需的。- 姓氏(lastname)是"Wallace"的文档可能会获得更高的得分。
-
filter
:过滤条件,用于确保文档满足特定的非得分相关条件。在这个查询中,filter
子句包含一个range
查询:- 年龄(age)必须在20岁到30岁之间(包括20岁和30岁),这是通过
range
查询的gte
(大于等于)和lte
(小于等于)参数实现的。
- 年龄(age)必须在20岁到30岁之间(包括20岁和30岁),这是通过
-
minimum_should_match
:至少需要满足的should
条件数量。在这个查询中,设置为1,意味着至少有一个should
条件需要被满足。
-
filter
子句:
filter
子句用于过滤结果,返回的文档集合必须满足filter
条件,但这些条件不会影响文档的相关性得分。- 在这个查询中,
filter
子句使用了一个range
查询,它指定了年龄的范围。这意味着所有返回的文档,除了必须满足must
和must_not
条件外,还必须有年龄在20到30岁之间。 - 使用
filter
子句可以提高查询性能,特别是对于大数据集,因为Elasticsearch可以利用缓存机制。
总结来说,查询将返回满足以下条件的文档:
- 性别为男性("M")。
- 地址包含"mill"。
- 年龄不是18岁,并且年龄在20到30岁之间。
- 姓氏为"Wallace"的文档可能会获得更高的得分,但至少需要满足一个
should
条件。