你用过Elasticsearch Percolate 反向检索吗?
- 2020 年 3 月 3 日
- 筆記
题记
percolator query 大家肯定在文档中见过,但实际业务中则较少用到。
本文探究一下percolator query的使用方法、原理、适用场景。
1、什么是percolator查询
percolator中文含义:渗透器。
percolator query等价于渗透查询或者反向查询。
我们相信大多数Elasticsearch开发人员都会按照惯例进行思考,我们为数据建模并将其存储在索引中。然后,他们通过搜索API定义查询以检索这些文档。
percolator query 的原理则完全相反,如下图所示:

您将查询存储到索引中,然后通过Percolate API定义文档以检索这些查询。
也就是:
- 传统查询,根据查询语句的查询条件返回文档。query->document。
- 而percolator渗透查询,根据文档返回与之匹配的查询语句。document->query。
2、percolator 查询的应用场景
举例:提供一个存储用户兴趣的平台,以便在每次有新内容进入时将正确的内容(通知警报)发送给正确的用户。
举例:用户订阅了特定主题,以便一旦该主题的新文章出现,就会向感兴趣的用户发送通知。
应用场景如下:
- 价格监控
- 新闻警报
- 股票警告
- 日志监控
- 天气预报
- 库存警报
- ……
3、实战一把
3.1 实际业务需求
阈值告警业务场景——当指定字段count值大于阈值时候,报警提示。
3.2 percolator mapping定义
DELETE my-index PUT /my-index { "mappings": { "properties": { "threshold": { "type": "long" }, "count": { "type": "long" }, "query": { "type": "percolator" } } } }
注意:percolator是等价于:keyword、long、Integer的数据类型。
"query": { "type": "percolator" }
这种定义结构是不可以修改的。
3.3 插入文档
PUT /my-index/_doc/1 { "threshold": 100, "query": { "bool": { "must": { "range": { "count":{ "gt":100 } } } } } }
3.4 查询实现
GET /my-index/_search { "query": { "percolate": { "field": "query", "documents": [ { "count": 1 }, { "count": 50 }, { "count": 120 }, { "count": 150 } ] } } }
返回结果(部分):
{ "took" : 4, .......省略..... }, "fields" : { "_percolator_document_slot" : [ 2, 3 ] } } ] } }
其中:"_percolator_document_slot” 指代的是:文档position,从0开始计数。
4、percolator 查询如何实现?
第一:通过使用DSL将用户的待设置的预警条件构造成Elasticsearch query语句,就好像它是一个文档一样,导入Elasticsearch索引。
第二:每次发布新文章时,都无需对其编入索引(索引化),就可以对其进行过滤,以了解文档值是否达到阈值。
第三:根据返回结果_percolator_document_slot,决定是否预警及精确值预警。
参考:
[1] https://www.agiratech.com/elasticsearch-percolator-query-implementation-in-ruby/
[2] https://qvault.io/2019/11/14/how-percolate-queries-in-elasticsearch-make-alerting-a-breeze/
[3] https://stackoverflow.com/questions/21536599/what-does-percolator-mean-do-in-elasticsearch