ElasticSearch 中查询和过滤器的区别
Different between query and filters in ElasticSearch
我对查询和过滤器之间的区别有点困惑。我的困惑源于我在文档中阅读的以下句子。
- 建议使用过滤器而不是查询,因为过滤器不会触发分数计算。
- 仅当响应是 yes/no 或精确搜索时才应使用过滤器。
- 过滤器可以包含名为 'query filters' 的查询(如 'term filter' 等)
我只想按 4 个属性值过滤,放入一个日期范围,然后对几个字段求和(聚合)。像这样
sum (salary, tenure) where name = A AND age = B AND join_date between X and Y
将查询视为模糊匹配,将过滤器视为传统数据库样式的查询。如果它有助于将查询视为数据库 LIKE,虽然更好。
该查询将分析您的搜索,将其分解成位,然后搜索与您的查询相似的文档。每个文档获得一个分数,最好的分数获胜,并在结果集中按分数顺序返回。所有这些评分都很昂贵,并且会减慢您的响应速度。
一个过滤器只是说我是包括还是排除这条数据,不涉及分数。要么过滤器匹配并且文档被包含,要么不匹配并且被排除。这一切都发生得非常快,并且不涉及排序。
您的示例 "query" 不需要查询,它是对 name = A 和 age = B 的过滤器。查询可能包含匹配 name = AA 的文档,因为它有点像 A。所以您在名称上有一个术语过滤器,在年龄上有一个术语过滤器,在 join_date 上有一个范围过滤器。然后您可以进行汇总以获得 SUM。
{
"query": {
"filtered": {
"filter": {
"and": [
{ "range": {
"join_date": {
"from": "X",
"to": "Y"
}
}},
{"term": { "name": "A" }},
{"term": { "age": "B" }},
]
}
}
},
"size": 0,
"aggs" : {
"salary_sum": {
"sum": { "field": "salary" }
},
"tenure_sum": {
"sum": { "field": "tenure" }
}
}
}
我对查询和过滤器之间的区别有点困惑。我的困惑源于我在文档中阅读的以下句子。
- 建议使用过滤器而不是查询,因为过滤器不会触发分数计算。
- 仅当响应是 yes/no 或精确搜索时才应使用过滤器。
- 过滤器可以包含名为 'query filters' 的查询(如 'term filter' 等)
我只想按 4 个属性值过滤,放入一个日期范围,然后对几个字段求和(聚合)。像这样
sum (salary, tenure) where name = A AND age = B AND join_date between X and Y
将查询视为模糊匹配,将过滤器视为传统数据库样式的查询。如果它有助于将查询视为数据库 LIKE,虽然更好。
该查询将分析您的搜索,将其分解成位,然后搜索与您的查询相似的文档。每个文档获得一个分数,最好的分数获胜,并在结果集中按分数顺序返回。所有这些评分都很昂贵,并且会减慢您的响应速度。
一个过滤器只是说我是包括还是排除这条数据,不涉及分数。要么过滤器匹配并且文档被包含,要么不匹配并且被排除。这一切都发生得非常快,并且不涉及排序。
您的示例 "query" 不需要查询,它是对 name = A 和 age = B 的过滤器。查询可能包含匹配 name = AA 的文档,因为它有点像 A。所以您在名称上有一个术语过滤器,在年龄上有一个术语过滤器,在 join_date 上有一个范围过滤器。然后您可以进行汇总以获得 SUM。
{
"query": {
"filtered": {
"filter": {
"and": [
{ "range": {
"join_date": {
"from": "X",
"to": "Y"
}
}},
{"term": { "name": "A" }},
{"term": { "age": "B" }},
]
}
}
},
"size": 0,
"aggs" : {
"salary_sum": {
"sum": { "field": "salary" }
},
"tenure_sum": {
"sum": { "field": "tenure" }
}
}
}