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过滤适合在大范围筛选数据,而查询则适合精确匹配数据。一般应用时, 应先使用过滤操作过滤数据, 然后使用查询匹配数据。
版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。