您的位置首页 >人工智能 >

ES0.90 percolator 反向检索存储查询、传入文档匹配

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 示例)

  1. 注册查询(把查询存入索引)

PUT /_percolator/twitter/rule01

{

"query": {

"term": {

"content": "elasticsearch"

}

}

}

  • twitter:业务目标索引名称(type)
  • rule01:这条查询规则的 id
  1. 提交文档做匹配查询

POST /twitter/_percolate

{

"doc": {

"content": "elasticsearch percolator test"

}

}

  • doc 里面就是要拿去检测的原始文档
  • 返回结果里会列出所有命中的规则 id
  1. 可选:refresh,注册后马上可用

POST /_percolator/_refresh

三、0.90 版本关键限制

项目说明
存储位置固定使用_percolator系统索引
接口端点使用_percolate端点
性能早期实现,没有 term 预选优化,规则量大时速度差
不支持高亮、打分、聚合、分页等高级能力,后续版本才逐步加上
语法差异和 5.x+ percolator 字段类型方案完全不兼容,不能直接迁移

四、典型使用场景

  1. 消息订阅:用户保存搜索条件,新消息进来匹配哪些订阅条件命中
  2. 告警规则:提前配置告警查询,日志流入后检查触发哪些告警规则
  3. 内容打标:提前定义标签匹配规则,新文档自动匹配对应标签规则

【相关 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 官方对应版本文档为准。