暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ElasticSearch中的query和filter区别

大数据开发运维架构 2021-08-03
1538

继续更新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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论