过滤查询
过滤查询<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"
]
}}
]
}
}
}