ES 0.90 版本的 percolator 是反向检索能力,和普通 ES 搜索逻辑反过来,普通搜索是文档存索引、提交查询匹配文档,而 percolator 是先把查询语句作为文档存入内置的_percolator索引,之后再传入待检测文档,让 ES 找出所有能匹配这份文档的、提前存好的查询。它底层把注册的查询持久化在_percolator这个特殊索引里,用目标索引名作为 type 区分不同业务的查询规则,适合做消息订阅、规则告警、内容匹配这类场景,比如用户订阅关键词,新消息进来检查哪些订阅规则命中。使用上分两大块,第一步是注册保存查询,调用接口往_percolator索引写入一条文档,文档里面包含 query 字段,里面就是正常 DSL 查询,写完之后最好 refresh,保证查询立刻生效;第二步是 percolate 校验,提交待检测文档到_percolate接口,ES 会遍历该索引下已经注册的所有查询,返回命中的查询 id 和信息。这个 0.90 的 percolator 是早期版本,有不少局限,没有后续版本的优化,匹配是偏原始的校验方式,不支持很多高级能力,接口写法也和 5.x 之后新版 percolator 字段类型完全不一样,升级的时候需要改造。
一、核心原理
- 常规 ES 流程:文档入库 → 输入查询 → 返回匹配文档
- ES0.90 percolator 流程:查询入库(存到_percolator) → 输入文档 → 返回匹配的查询
- 底层:_percolator就是一个普通索引,每条注册的查询就是这个索引里的一条文档,type 对应业务目标索引名
二、操作步骤(REST 示例)
- 注册查询(把查询存入索引)
PUT /_percolator/twitter/rule01
{
"query": {
"term": {
"content": "elasticsearch"
}
}
}
- twitter:业务目标索引名称(type)
- rule01:这条查询规则的 id
- 提交文档做匹配查询
POST /twitter/_percolate
{
"doc": {
"content": "elasticsearch percolator test"
}
}
- doc 里面就是要拿去检测的原始文档
- 返回结果里会列出所有命中的规则 id
- 可选:refresh,注册后马上可用
POST /_percolator/_refresh
三、0.90 版本关键限制
| 项目 | 说明 |
|---|---|
| 存储位置 | 固定使用_percolator系统索引 |
| 接口端点 | 使用_percolate端点 |
| 性能 | 早期实现,没有 term 预选优化,规则量大时速度差 |
| 不支持 | 高亮、打分、聚合、分页等高级能力,后续版本才逐步加上 |
| 语法差异 | 和 5.x+ percolator 字段类型方案完全不兼容,不能直接迁移 |
四、典型使用场景
- 消息订阅:用户保存搜索条件,新消息进来匹配哪些订阅条件命中
- 告警规则:提前配置告警查询,日志流入后检查触发哪些告警规则
- 内容打标:提前定义标签匹配规则,新文档自动匹配对应标签规则
【相关 FAQ】
问题 1:ES0.90 percolator 里,_percolator 索引是需要手动创建的吗?
回答 1:ES0.90 percolator 使用的时候,_percolator索引不需要手动提前创建,写入第一条注册查询的时候 ES 会自动生成这个索引,写入时 type 填写业务目标索引名字即可。
问题 2:ES0.90 percolator 注册的查询,可以修改和删除吗?
回答 2:ES0.90 percolator 注册的查询本质是_percolator索引中的文档,所以可以用普通的 update、delete 接口,根据规则 id 更新或者删除这条存储的查询。
问题 3:ES0.90 percolator 和新版 percolator 最大区别是什么?
回答 3:ES0.90 percolator 依赖独立_percolator索引、_percolate接口;新版是 percolator 字段类型,查询和业务文档存在同一个索引,DSL 写法、性能、支持功能都不一样,0.90 的 percolator 方案已经废弃。
问题 4:ES0.90 percolator 传入文档的时候,文档本身会被持久化保存吗?
回答 4:ES0.90 percolator 在_percolate请求里提交的 doc 只是临时用于匹配,不会自动存入业务索引,只用来和已经存好的查询做匹配校验。
【参考资料】
[2026-10-26](ES 0.90 的 percolator 把查询存进索引,再拿文档去问它)腾讯云开发者社区
[2011-02-09](Percolator)Elastic Blog
[未知](Percolate API | Java API [0.90])Elastic 官方文档
[未知](Elasticsearch 1.0.0.Beta1 Release Notes)Elastic 官方发布日志
【免责声明】
本文内容仅针对 Elasticsearch 0.90 版本 percolator 功能做技术说明,该版本早已停止维护,存在性能缺陷、安全风险,不建议在生产环境继续使用;内容仅供老旧系统学习、存量代码排查参考,不构成线上部署方案;不同版本 ES percolator 语法差异极大,迁移升级请以 Elastic 官方对应版本文档为准。
