你用過Elasticsearch Percolate 反向檢索嗎?

題記

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