7.过滤查询

86 阅读1分钟

过滤查询

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

查询即是之前提到的query查询,它(查询)默认会计算每个返回文档的得分,然后根据得分排序。

而过滤(filter)只会筛选出符合的文档,并不计算得分,而且它可以缓存文档。所以,单从性能考虑,过滤比查询更快。

换句话说过滤适合在大范围筛选数据,而查询则适合精确匹配数据。 一般应用时,应先使用过滤操作过滤数据,然后使用查询匹配数据。 ![[Pasted image 20231103161104.png]] 通过过滤查询,排除不想要的数据,大大减少了查询的数据量。

使用

GET /products/_search
{
  "query":{
    "bool": {
      "filter": [
        {...},   //查询条件
        {...}
      ]
    }
  }
}
  • 注意:
    • 在执行filter和query时,先执行filter在执行query
    • Elasticsearch会自动缓存经常使用的过滤器,以加快性能。

官网文档 Filter search results | Elasticsearch Guide [8.10] | Elastic

类型

常见过滤类型有: term . terms . ranage、exists、ids等filter。 官网文档 Filter search results | Elasticsearch Guide [8.10] | Elastic

term、terms过滤

GET /products/_search
{
  "query":{
    "bool": {
      "filter": [
        {"term": {"description": "很"}},
        {"term": {"description": "好"}},
        {"terms": {
          "description": [
            "很",
            "好"
          ]
        }}
      ]
    }
  }
}

range filter

GET /products/_search
{
  "query":{
    "bool": {
      "filter": [
        {"range": {
          "price": {
            "gte": 1,
            "lte": 100
          }
        }}
      ]
    }
  }
}

exist filter

过滤存在指定字段,获取字段不为空的索引记录使用

GET /products/_search
{
  "query":{
    "bool": {
      "filter": [
        {"exists": {
          "field": "id"
        }}
      ]
    }
    
  }
}

ids filter

GET /products/_search
{
  "query":{
    "bool": {
      "filter": [
        {"ids": {
          "values": [
            "1"
          ]
        }}
      ]
    }
  }
}