ElasticSearch(es) filter过滤器

es中filter是过滤器,条件必须匹配,但不贡献算分,同时会查询对结果进行缓存,不会计算相关度,避免计算分值,执行速度非常快。

过滤器类型

1.term Filter

GET /blank/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "title": {
            "value": "java学习"
          }
        }}
      ],
      "filter": {
        "term": {
          "content":"教程"
        }
      }
    }
  }
}

先在content中查找“教程”的数据,再执行query中查找“java学习”的数据

2.ranage filter

ranage语法: gt : 大于
lt : 小于
gte : 大于等于
lte :小于等于

GET /blank/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "title": {
            "value": "java学习"
          }
        }}
      ],
      "filter": {
        "range": {
          "createtime":{"gte": "2022-06-01","lte": "2022-07-01"}
        }
      }
    }
  }
}

先在createtime中查找创建时间(createtime)大于等于2022-06-01,小于等于2022-07-01的数据,再执行query中查找“java学习”的数据

3.exists filter

exists是用来匹配文档的mapping中是否包含某一个字段,如果是就返回。它过滤存在指定字段,获取字段不为空的数据。

GET /blank/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "title": {
            "value": "java学习"
          }
        }}
      ],
      "filter": {
        "exists": {
          "field":"articlestate"
        }
      }
    }
  }
}

先查询articlestate属性不为null的数据。

4.and , or , not查询

如果不行用bool,可以用and , or , not查询

GET /blank/_search
{
  "query": {
      "filter": {
        "and":[
          {
            "term":{
              "price" : 10
            }
          },
          {
            "term":{
              "articleid":"100000"
            }
          }
        ]
      }
    }
  }
}

5.ids filter

过滤含有指定字段的索引记录,类似于mysql的where id in ()的语义,他支持value属性,可以传入一个数组

GET /blank/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "title": {
            "value": "java学习"
          }
        }}
      ],
      "filter": {
        "ids": {
          "values":["1", "2", "6"]
        }
      }
    }
  }
}

返回属性_id为1、2、6的文档,如果存在的话

6.bool filter

布尔过滤

GET ems/_search
{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": {
            "match": {
              "title": "java学习教程"
            }
          }
        }
      }
    }
  }
}

总结

1. Elasticsearch会自动缓存经常使用的过滤器,以加快性能。在执行filter和query时,先执行filter在执行query。

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