題記
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
推薦閱讀:
重磅 | 死磕Elasticsearch方法論認知清單(2019國慶更新版)乾貨 | 95後運維小哥20天+通過Elastic認證考試經驗分享
更短時間更快習得更多幹貨!