继续更新ElasticSearch学习记录:Query和Filter区别
两者的区别我们先来看EleasticSearch官方的解释:
主要区别:
Query在执行时既要计算文档是否匹配,还要计算文档相对于其他文档的匹配度有多高,匹配度越高,_score 分数就越高
Filter在执行时只关心文档是否和查询匹配,不会计算匹配度,也就是得分;Filter为什么会更快?经常使用的过滤器将被Elasticsearch自动缓存,以提高性能。
性能对比:
Fileter过滤查询是对集合包含/排除的简单检查,快速返回结果,如果存在多个Filter过滤条件,当至少有一个过滤查询是“稀疏”(仅有少量匹配的文档)时,可以利用各种优化,并且可以将缓存经常使用的filter过滤查询缓存在内存中以加快访问速度。
Query检索(评分查询)不仅要查找匹配的文档,还要计算每个文档的相关程度,这通常会使其比非评分文档更复杂。另外,查询结果不可缓存。所以效率相对于Filter要差很多。
查询示例
1、filter与query示例
PUT filter_query/_doc/1
{
“address”: {
“country”: “china”,
“province”: “shandong”,
“city”: “jinan”
},
“name”: “ljs1”,
“age”: 32,
“join_date”: “2021-08-01”
}
PUT filter_query/_doc/2
{
“address”: {
“country”: “china”,
“province”: “shandong”,
“city”: “qingdao”
},
“name”: “ljs2”,
“age”: 35,
“join_date”: “2015-07-05”
}
PUT filter_query/_doc/3
{
“address”: {
“country”: “china”,
“province”: “shandong”,
“city”: “yantai”
},
“name”: “ljs3”,
“age”: 25,
“join_date”: “2015-06-05”
}
PUT filter_query/_doc/4
{
“address”: {
“country”: “china”,
“province”: “shandong”,
“city”: “weifang”
},
“name”: “ljs4”,
“age”: 28,
“join_date”: “2015-05-05”
}
这个做下查询测试:
年龄必须大于等于32,同时join_date必须是2021-08-01
2.查询语句json:
GET /filter_query/_doc/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"join_date":"2021-08-01"
}
}
],
"filter":{
"range":{
"age":{
"gte":30
}
}
}
}
}
}
3.kibana发送请求,查询结果如下:
文章转载自大数据开发运维架构,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。