Elasticsearch?percolate?查詢示例詳解
Elasticsearch 通常如何工作?
我們將文檔索引到 Elasticsearch 中并對其運行查詢以獲得滿足提供的搜索條件的文檔。 我們構(gòu)造一個匹配或術(shù)語查詢作為輸入,匹配查詢的文檔作為結(jié)果返回。
但這不是 percolate query 的情況.....
讓我們看看這篇文章中的 percolate 查詢,看看它有什么用處。
什么是 percolate 查詢?
它與 Elasticsearch 搜索的一般工作方式相反。 在 Percolate Query 中,你將提供文檔作為輸入,以從與輸入文檔匹配的索引中查找 query。 可以根據(jù)已保存的查詢使用 Percolate Query 對文檔進(jìn)行分類或標(biāo)記。
Percolate query 調(diào)用 Elasticsearch 經(jīng)典搜索的逆向 因為,
- query 將被存儲而不是 Elasticsearch 索引中的文檔。
- 文檔將用于代替搜索請求中的 query。
Elasticsearch 將生成與輸入文檔匹配的查詢列表。
你可能想知道為什么我需要 Percolate 以及如何使用它? 因此,讓我們看看下面的一些用例。
Percolate 用例
基于 percolate query 上面的描述,我們可以把它應(yīng)用于如下的一些查詢用例:
- 假設(shè)你正在開發(fā)一家在線商店,并提供在特定產(chǎn)品在特定價格范圍內(nèi)或以特定折扣上市時創(chuàng)建提醒的功能。
- 你正在創(chuàng)建推文或帖子分析,并且需要只考慮符合特定條款或條件的內(nèi)容。 此外,每條滿足特定要求的推文或帖子都需要使用特定標(biāo)簽進(jìn)行標(biāo)記。
Percolate query 實施
讓我們通過一個在線商店用例來更詳細(xì)地探索 Percolate。
假設(shè)消費者希望在 Apple iPhone 12 售價 500 美元時收到通知。
brand:apple AND price<500 AND model:'iphone 12'
使用一些示例數(shù)據(jù)創(chuàng)建 products 索引:
`
PUT products
{
"mappings": {
"properties": {
"brand": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"model": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"price": {
"type": "long"
}
}
}
}
PUT products/_bulk
{ "index" : { "_id": "prod101" } }
{ "brand" : "Apple", "model" : "iphone 11", "price": 800 }
{ "index" : { "_id": "prod102" } }
{ "brand" : "Samsung", "model" : "galaxy m32", "price": 700 }
`
創(chuàng)建 percolate 索引:
必須將原始索引中的相同字段映射添加到 percolate 索引中。 只有需要搜索的字段必須從原始索引的映射中復(fù)制。
`
PUT product_percolate
{
"mappings": {
"properties": {
"query": {
"type": "percolator"
},
"brand": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"model": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"price": {
"type": "long"
}
}
}
}
`
讓我們保存一個用戶想要提醒的 query:
`
PUT product_percolate/_doc/user1_iphone_12
{
"query": {
"bool": {
"must": [
{
"term": {
"brand.keyword": {
"value": "Apple"
}
}
},
{
"term": {
"model.keyword": {
"value": "iphone 12"
}
}
},
{
"range": {
"price": {
"lte": 500
}
}
}
]
}
}
}
`
現(xiàn)在進(jìn)行產(chǎn)品查詢時,將不會返回任何結(jié)果,因為所有 iPhone 12 不低于 500 美元。
`
POST products/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"brand.keyword": {
"value": "Apple"
}
}
},
{
"term": {
"model.keyword": {
"value": "iphone 12"
}
}
},
{
"range": {
"price": {
"lte": 500
}
}
}
]
}
}
}
`
上面的搜索將返回如下的結(jié)果:
`
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}
`
上面的結(jié)果表明,沒有一個產(chǎn)品滿足我們的搜索條件。
讓我們添加價格為 499 的新產(chǎn)品 iPhone 12:
POST product/_doc/prod104
{
"brand": "Apple",
"model": "iphone 12",
"price": 499
}
不會發(fā)送自動通知,因為在索引文檔時不會運行 percolate 查詢。 percolate 查詢必須手動運行。
Percolate query API
你可以通過兩種方式執(zhí)行 percolate query:
首先,你可以使用單個文檔或多個文檔作為輸入運行 percolate,如下所示:
單個文檔
GET product_percolate/_search
{
"query": {
"percolate": {
"field": "query",
"document": {
"brand": "Apple",
"model": "iphone 12",
"price": 499
}
}
}
}
多個文檔
`
GET product_percolate/_search
{
"query": {
"percolate": {
"field": "query",
"documents": [
{
"brand": "Apple",
"model": "iphone 12 pro",
"price": 600
},
{
"brand": "Apple",
"model": "iphone 12",
"price": 499
}
]
}
}
}
`
你將收到類似于正常查詢響應(yīng)的響應(yīng),字段 _source 將顯示匹配的查詢,但字段 _percolator_document_slot 將顯示在這種情況下多個文檔中匹配的文檔的位置。
`
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.2615292,
"hits": [
{
"_index": "product_percolate",
"_id": "user1_iphone_12",
"_score": 1.2615292,
"_source": {
"query": {
"bool": {
"must": [
{
"term": {
"brand.keyword": {
"value": "Apple"
}
}
},
{
"term": {
"model.keyword": {
"value": "iphone 12"
}
}
},
{
"range": {
"price": {
"lte": 500
}
}
}
]
}
}
},
"fields": {
"_percolator_document_slot": [
0
]
}
}
]
}
}
`
其次,你可以提供現(xiàn)有索引中的文檔 ID,如下所示(目前不支持傳遞多個 ID):
GET product_percolate/_search
{
"query": {
"percolate": {
"field": "query",
"index": "product",
"id": "prod104"
}
}
}
上面的查詢的結(jié)果為:
`
{
"took": 7,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.2615292,
"hits": [
{
"_index": "product_percolate",
"_id": "user1_iphone_12",
"_score": 1.2615292,
"_source": {
"query": {
"bool": {
"must": [
{
"term": {
"brand.keyword": {
"value": "Apple"
}
}
},
{
"term": {
"model.keyword": {
"value": "iphone 12"
}
}
},
{
"range": {
"price": {
"lte": 500
}
}
}
]
}
}
},
"fields": {
"_percolator_document_slot": [
0
]
}
}
]
}
}
`
如何將 Percolate 與你的應(yīng)用程序集成
- 如果你使用 Logstash 為數(shù)據(jù)編制索引,則可以使用 Elasticsearch 過濾器插件并運行過濾查詢以查看傳入文檔是否與任何已保存的查詢匹配。 如果是這樣,你可以使用單獨的輸出插件向用戶發(fā)送通知。
- 如果自定義連接器用于數(shù)據(jù)索引,則 Elastic 客戶端可用于運行 percolate query 并直接從連接器發(fā)送通知。
為什么要 percolate 而不是 watcher?
相對于percolate,watcher 不太適合需要實時匹配的場景。 是的,相比之下還有更多的爭論空間,但暫時,我認(rèn)為這不在本博客的范圍之內(nèi)。
以上就是Elasticsearch percolate 查詢示例詳解的詳細(xì)內(nèi)容,我希望本文能讓你非常簡單地掌握 percolate 查詢,更多關(guān)于Elasticsearch percolate查詢的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中stream.map和stream.forEach的區(qū)別
本文主要介紹了Java中stream.map和stream.forEach的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
SpringBoot?Http遠(yuǎn)程調(diào)用的方法
這篇文章主要為大家詳細(xì)介紹了SpringBoot?Http遠(yuǎn)程調(diào)用的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08
springboot創(chuàng)建線程池的兩種方式小結(jié)
這篇文章主要介紹了springboot創(chuàng)建線程池的兩種方式小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot Mybatis動態(tài)數(shù)據(jù)源切換方案實現(xiàn)過程
這篇文章主要介紹了SpringBoot+Mybatis實現(xiàn)動態(tài)數(shù)據(jù)源切換方案過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04

