你用過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