过滤查询
过滤查询<filter query>
,其实准确来说,ES中的查询操作分为2种:查询(query)和过滤(filter)。
查询即是之前提到的query查询,它(查询)默认会计算每个返回文档的得分,然后根据得分排序。
而过滤(filter)只会筛选出符合的文档,并不计算得分,而且它可以缓存文档。所以,单从性能考虑,过滤比查询更快。
换句话说过滤适合在大范围筛选数据,而查询则适合精确匹配数据。 一般应用时,应先使用过滤操作过滤数据,然后使用查询匹配数据。 ![[Pasted image 20231103161104.png]] 通过过滤查询,排除不想要的数据,大大减少了查询的数据量。
使用
http
复制代码
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过滤
http
复制代码
GET /products/_search { "query":{ "bool": { "filter": [ {"term": {"description": "很"}}, {"term": {"description": "好"}}, {"terms": { "description": [ "很", "好" ] }} ] } } }
range filter
http
复制代码
GET /products/_search { "query":{ "bool": { "filter": [ {"range": { "price": { "gte": 1, "lte": 100 } }} ] } } }
exist filter
过滤存在指定字段,获取字段不为空的索引记录使用
http
复制代码
GET /products/_search { "query":{ "bool": { "filter": [ {"exists": { "field": "id" }} ] } } }
ids filter
http
复制代码
GET /products/_search { "query":{ "bool": { "filter": [ {"ids": { "values": [ "1" ] }} ] } } }