📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入
Elasticsearch filter context 的实践案例

知识背景 #

在 ES 查询优化的建议里,很多时候为了避免算分逻辑和利用缓存逻辑,Elastic 会建议大家使用 filter 条件。

filter 的使用条件和原理具体可以参照之前写的博文《Elasticsearch filter context 的使用原理》(https://mp.weixin.qq.com/s/Jsgx_RL0T794Z2bxuKtqOA)

这里我们来研究 2 个实用案例,具体的感受一下 filter context 的使用效果。

普通案例 #

第一个案例,我们选择一个 range date 的条件进行测试环境测试,将其中 must 条件改成 filter 条件,测试 5 次以上,观测其缓存数据。

# 清空缓存
POST indexname/_cache/clear?query=true
# 查询 5-10 次
GET indexname/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "date": {
              "gte": "2024-01-01",
              "lte": "2024-03-01"
            }
          }
        }
      ]
    }
  }
}
# 查询缓存状态
GET indexname/_stats?human=true&filter_path=*.*.query_cache
​

可以看到 query_cache 的 size/count 始终为 0,也就是并没有利用到缓存。

查询的耗时也维持在 900-1100ms 左右。

再测试 filter 条件

POST indexname/_cache/clear?query=true
# 查询 5-10 次
GET indexname/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "date": {
              "gte": "2024-01-01",
              "lte": "2024-03-01"
            }
          }
        }
      ]
    }
  }
}
​
GET indexname/_stats?human=true&filter_path=*.*.query_cache
​

在重复的查询过程中,查询速度有明显的加快。

多次查询之后

查看 query_cache size/count 有明显的使用。

使用误区 #

那是不是所有的 filter 就会加速呢?再看下面这个查询

must 方法

GET indexname/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "idno": [
              "2024001Q0001235681",
              "2024001Q0002356812",
              "2024001Q0008197301",
              "2024001Q0002817617"
            ]
          }
        }
      ]
    }
  }
}

filter 方法

GET indexname/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "idno": [
              "2024001Q0001235681",
              "2024001Q0002356812",
              "2024001Q0008197301",
              "2024001Q0002817617"
            ]
          }
        }
      ]
    }
  }
}
​

可以看到 2 个查询条件多次查询后,查询耗时差别不大。

并且都产生了 query cache 的使用

must 条件

filter 条件

难道这两个查询都成了 filter context 查询?既然 filter context 的判断依据之一是查询条件是否算分,就可以使用 “explain”: true 进行进一步分析。

must 方法

filter 方法

可以看到查询方法在 ES 这里做了隐性的转换。这两个查询对应的底层查询方法为 ConstantScore,而 ConstantScore 也是可以被认为是 filter context 的一种。因此这里的 must 查询也达到 filter 查询使用 querycache 的优势。

校验思路 #

  • cache 数据
GET indexname/_stats?human=true&filter_path=*.*.query_cache

也可以通过简单安装一个 INFINI Console(https://docs.infinilabs.com/console/main/docs/getting-started/install/) 进行图表监控(在监控图表-索引-advance 中)

  • 查询使用的算分方法 利用 explain API 判断查询语句是否转换成符合 filter context 的类型,比如是否转换成了 constant score,或者算分规则被消除了,等等
GET indexname/_search
{"explain": true,
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "idno": [
              "2024001Q0001235681",
              "2024001Q0002356812",
              "2024001Q0008197301",
              "2024001Q0002817617"
            ]
          }
        }
      ]
    }
  }
}
标签
2026 x
开源 x
赞助 x
开源生态 x
社区 x
低空经济 x
商业化 x
Easysearch x
数据分析 x
金猿奖 x
国产化 x
搜索引擎 x
Coco AI x
技术卓越奖 x
创新产品奖 x
IT168 x
APM x
Skywalking x
产品更新 x
Easy-Es x
Coco x
AI x
GitLab x
代码审核 x
人工智能 x
石油石化 x
performance x
Gitee x
投票 x
Meilisearch x
Rust x
轻量级 x
搜索百科 x
Docker x
Docker Compose x
Easyserach x
Console x
DevOps x
Elasticsearch x
国产替代 x
backup x
snapshot x
CCR x
Gateway x
esdump x
source_reuse x
ignore_above x
OpenSearch x
AWS x
Lucene x
Solr x
Easyearch x
发明专利 x
数据分区 x
国际专利 x
一等奖 x
人工智能应用创新大赛 x
bulk x
embedding x
OpenAI x
IK x
TDBC x
2025 x
信通院 x
可信数据库大会 x
搜索型数据库 x
中国数据库产业图谱 x
上海开源创新菁英荟 x
开源创新新星企业 x
Workshop x
AI 搜索 x
智能助手 x
Automation x
Logstash x
MongoDB x
开源中国 x
直播 x
merge x
Elasticsearch 9 x
GitCode x
AI搜索 x
Cloud x
rollup x
Kubernetes x
Operator x
Arm64 x
Snapshot x
S3 x
Grafana x
Opensearch x
Nginx x
直播活动 x
搜索客社区 x
Meetup x
ES x
企业搜索 x
DeepSeek x
RAG x
certificate x
windows x
Rollup x
TopN x
Filebeat x
Ubuntu x
请求限速 x
INFINI Console x
指标 x
Kibana x
多集群 x
client x
Spring Boot x
ECE x
ES Bulk x
vector database x
Postgres x
可搜索快照 x
SDK x
官网 x
Web 开发 x
Next.js x
React x
Three.js x
Metrics x
Helm x
filter x
querycache x
practice x
Agent x
localStorage x
响应式 x
时间组件 x
时区组件 x
极限科技 x
三周年 x
周年庆 x
国家高新技术企业 x
校园招聘 x
湖北工业大学 x
Tauri x
Web 开发人员 x
桌面应用开发 x
桌面端 x
Electron x
Pizza x
认证培训 x
报名 x
Scrapy x
爬虫 x
Rust开发者大会 x
docsearch x
文档搜索 x
Easyseach x
有奖征文 x
黑神话悟空 x
EKS x
征文系列 x
跨集群搜索 x
科技中小企业 x
白皮书 x
Python SDK x
数据库产业图谱 x
超大规模 x
分布式集群 x
写入限流 x
2024可信数据库发展大会 x
创新型中小企业 x
搜索数据库 x
正排索引 x
免费许可证 x
K8S x
DTC2024 x
实时搜索 x
ES国产化 x
Redis x
OOM x
测试 x
内存 x
趋势 x
AI绘画 x
Stable Diffusion x
Diffusion x
Model x
GAN x
语义搜索 x
知识图 x
向量数据库 x
中国信通院 x
星河(Galaxy) x
标杆案例 x
鲲鹏 x
鲲鹏技术认证 x
客户端 x
日志平台 x
LDAP x
Loadgen x
中国一汽 x
国内数据库 x
墨天轮 x
监控系统 x
集成测试 x
ZSTD x
Helm Charts x
国产适配 x
兆芯 x
Linux x
LoongArch x
信创适配 x
二维拆分算法 x
中国移动云 x
Vault x
加密 x
安全工具 x
kNN x
向量检索 x
图片搜索 x
Alerting x
SQL x
搜索 x
Embedding x
可信数据库 x
统信 x
海光 x
龙芯 x
restore x
Arm x
大数据企业证书 x
移动云大会 x
信通院产品评测 x
国内首家 x
数据可视化 x
北京软协 x
第十届理事会会员单位 x
Apache Arrow x
宣传片 x
大会分享 x
多集群管理 x
无缝数据迁移 x
Loadrun x
INFINI Gateway x
log4j x