9_(过滤查询) Filter Query

是什么

准确来说,ES中的查询操作分为2种: 查询(query)和过滤(filter)

查询即是之前提到的query查询,它 (查询)默认会计算每个返回文档的得分,然后根据得分排序。而过滤(filter)只会筛选出符合的文档,并不计算 得分,且它可以缓存文档 。所以,单从性能考虑,过滤比查询更快。

换句话说,过滤适合在大范围筛选数据,而查询则适合精确匹配数据。一般应用时, 应先使用过滤操作过滤数据, 然后使用查询匹配数据。

在这里插入图片描述


过滤语法

NOTE:

  • 在执行filter和query时,先执行filter在执行query
  • Elasticsearch会自动缓存经常使用的过滤器,以加快性能
  • 使用过滤查询必须使用bool查询
GET /ems/emp/_search
{
  "query": {
    "bool": {
      "must": [
        {
         "term": {
           "name": {
             "value": "小五"
           }
         }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gte": 1,
            "lte": 10
          }
        }
      }
    }
  }
}

执行过程: 先从ES从执行过滤查询,找到符合年龄范围在[1,10]的文档,这个过程不会计算得分,然后再执行查询操作,从满足条件的这些文档中又去查找"name"属性的值为"小五"的文档,并将可能的文档计算的得分。


常见的过滤器类型

term Filter

term 用在过滤中查询,表示查询指定字段含有该词的文档

GET /ems/emp/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "name": {
              "value": "小五"
            }
          }
        }
      ],
      "filter": {
        "term": {
          "content": "spring"
        }
      }
    }
  }
}

terms Filter

term只能匹配一个字段,要想过滤多个字段,使用terms

GET /ems/emp/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "name": {
              "value": "小五"
            }
          }
        }
      ],
      "filter": {
        "terms": {
          "content": ["spring","java"]
        }
      }
    }
  }
}

range Filter

顾名思义:就是先查找满足某个指定范围的字段

GET /ems/emp/_search
{
  "query": {
    "bool": {
      "must": [
        {
         "term": {
           "name": {
             "value": "小五"
           }
         }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gte": 1,
            "lte": 10
          }
        }
      }
    }
  }
}

exists Filter

先过滤掉不存在指定字段的文档

GET /ems/emp/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "filter": {
        "exists": {
          "field": "age"
        }
      }
    }
  }
} 

ids Filter

查找含有指定字段的索引记录

GET /ems/emp/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "filter": {
          "ids": {
            "values": [
              "1","OY0TqnYB5vZ1Et4zupDf"
            ]
          }
      }
    }
  }
} 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值