天天看點

你用過Elasticsearch Percolate 反向檢索嗎?

你用過Elasticsearch Percolate 反向檢索嗎?
連結

1、什麼是percolator查詢

percolator中文含義:滲透器。

percolator query等價于滲透查詢或者反向查詢。

我們相信大多數Elasticsearch開發人員都會按照慣例進行思考,我們為資料模組化并将其存儲在索引中。然後,他們通過搜尋API定義查詢以檢索這些文檔。

percolator query 的原理則完全相反,如下圖所示:

你用過Elasticsearch Percolate 反向檢索嗎?

您将查詢存儲到索引中,然後通過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

繼續閱讀