![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SZldjNjBjN0ATZilTYhVDOxcjM0EWO1EWN2UGMxgjZm9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
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": {
"query": {
"type": "percolator"
}
}
}
}
注意:percolator是等價于:keyword、long、Integer的資料類型。
"query": {
這種定義結構是不可以修改的。
3.3 插入文檔
PUT /my-index/_doc/1
"threshold": 100,
"query": {
"bool": {
"must": {
"range": {
"count":{
"gt":100
}
}
3.4 查詢實作
GET /my-index/_search
"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