Elasticsearch?percolate?查詢(xún)示例詳解
Elasticsearch 通常如何工作?
我們將文檔索引到 Elasticsearch 中并對(duì)其運(yùn)行查詢(xún)以獲得滿足提供的搜索條件的文檔。 我們構(gòu)造一個(gè)匹配或術(shù)語(yǔ)查詢(xún)作為輸入,匹配查詢(xún)的文檔作為結(jié)果返回。
但這不是 percolate query 的情況.....
讓我們看看這篇文章中的 percolate 查詢(xún),看看它有什么用處。
什么是 percolate 查詢(xún)?
它與 Elasticsearch 搜索的一般工作方式相反。 在 Percolate Query 中,你將提供文檔作為輸入,以從與輸入文檔匹配的索引中查找 query。 可以根據(jù)已保存的查詢(xún)使用 Percolate Query 對(duì)文檔進(jìn)行分類(lèi)或標(biāo)記。
Percolate query 調(diào)用 Elasticsearch 經(jīng)典搜索的逆向 因?yàn)椋?/p>
- query 將被存儲(chǔ)而不是 Elasticsearch 索引中的文檔。
- 文檔將用于代替搜索請(qǐng)求中的 query。
Elasticsearch 將生成與輸入文檔匹配的查詢(xún)列表。
你可能想知道為什么我需要 Percolate 以及如何使用它? 因此,讓我們看看下面的一些用例。
Percolate 用例
基于 percolate query 上面的描述,我們可以把它應(yīng)用于如下的一些查詢(xún)用例:
- 假設(shè)你正在開(kāi)發(fā)一家在線商店,并提供在特定產(chǎn)品在特定價(jià)格范圍內(nèi)或以特定折扣上市時(shí)創(chuàng)建提醒的功能。
- 你正在創(chuàng)建推文或帖子分析,并且需要只考慮符合特定條款或條件的內(nèi)容。 此外,每條滿足特定要求的推文或帖子都需要使用特定標(biāo)簽進(jìn)行標(biāo)記。
Percolate query 實(shí)施
讓我們通過(guò)一個(gè)在線商店用例來(lái)更詳細(xì)地探索 Percolate。
假設(shè)消費(fèi)者希望在 Apple iPhone 12 售價(jià) 500 美元時(shí)收到通知。
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" } } } } `
讓我們保存一個(gè)用戶(hù)想要提醒的 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)品查詢(xún)時(shí),將不會(huì)返回任何結(jié)果,因?yàn)樗?nbsp;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é)果表明,沒(méi)有一個(gè)產(chǎn)品滿足我們的搜索條件。
讓我們添加價(jià)格為 499 的新產(chǎn)品 iPhone 12:
POST product/_doc/prod104 { "brand": "Apple", "model": "iphone 12", "price": 499 }
不會(huì)發(fā)送自動(dòng)通知,因?yàn)樵谒饕臋n時(shí)不會(huì)運(yùn)行 percolate 查詢(xún)。 percolate 查詢(xún)必須手動(dòng)運(yùn)行。
Percolate query API
你可以通過(guò)兩種方式執(zhí)行 percolate query:
首先,你可以使用單個(gè)文檔或多個(gè)文檔作為輸入運(yùn)行 percolate,如下所示:
單個(gè)文檔
GET product_percolate/_search { "query": { "percolate": { "field": "query", "document": { "brand": "Apple", "model": "iphone 12", "price": 499 } } } }
多個(gè)文檔
` GET product_percolate/_search { "query": { "percolate": { "field": "query", "documents": [ { "brand": "Apple", "model": "iphone 12 pro", "price": 600 }, { "brand": "Apple", "model": "iphone 12", "price": 499 } ] } } } `
你將收到類(lèi)似于正常查詢(xún)響應(yīng)的響應(yīng),字段 _source 將顯示匹配的查詢(xún),但字段 _percolator_document_slot 將顯示在這種情況下多個(gè)文檔中匹配的文檔的位置。
` { "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,如下所示(目前不支持傳遞多個(gè) ID):
GET product_percolate/_search { "query": { "percolate": { "field": "query", "index": "product", "id": "prod104" } } }
上面的查詢(xún)的結(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 過(guò)濾器插件并運(yùn)行過(guò)濾查詢(xún)以查看傳入文檔是否與任何已保存的查詢(xún)匹配。 如果是這樣,你可以使用單獨(dú)的輸出插件向用戶(hù)發(fā)送通知。
- 如果自定義連接器用于數(shù)據(jù)索引,則 Elastic 客戶(hù)端可用于運(yùn)行 percolate query 并直接從連接器發(fā)送通知。
為什么要 percolate 而不是 watcher?
相對(duì)于percolate,watcher 不太適合需要實(shí)時(shí)匹配的場(chǎng)景。 是的,相比之下還有更多的爭(zhēng)論空間,但暫時(shí),我認(rèn)為這不在本博客的范圍之內(nèi)。
以上就是Elasticsearch percolate 查詢(xún)示例詳解的詳細(xì)內(nèi)容,我希望本文能讓你非常簡(jiǎn)單地掌握 percolate 查詢(xún),更多關(guān)于Elasticsearch percolate查詢(xún)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Java分布式系統(tǒng)中session一致性問(wèn)題
這篇文章主要介紹了Java分布式系統(tǒng)中session一致性問(wèn)題,對(duì)分布式系統(tǒng)感興趣的同學(xué),要仔細(xì)看一下2021-04-04解決Java包裝類(lèi)比較時(shí)遇到的問(wèn)題
所謂包裝類(lèi)的作用就是將原始數(shù)據(jù)類(lèi)型轉(zhuǎn)換成引用數(shù)據(jù)類(lèi)型,下面這篇文章主要給大家介紹了關(guān)于在Java包裝類(lèi)比較時(shí)遇到的問(wèn)題的解決方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-09-09基于python locust庫(kù)實(shí)現(xiàn)性能測(cè)試
這篇文章主要介紹了基于python locust庫(kù)實(shí)現(xiàn)性能測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Java無(wú)界阻塞隊(duì)列DelayQueue詳細(xì)解析
這篇文章主要介紹了Java無(wú)界阻塞隊(duì)列DelayQueue詳細(xì)解析,DelayQueue是一個(gè)支持時(shí)延獲取元素的無(wú)界阻塞隊(duì)列,隊(duì)列使用PriorityQueue來(lái)實(shí)現(xiàn),隊(duì)列中的元素必須實(shí)現(xiàn)Delayed接口,在創(chuàng)建元素時(shí)可以指定多久才能從隊(duì)列中獲取當(dāng)前元素,需要的朋友可以參考下2023-12-12java通過(guò)snmp協(xié)議獲取物理設(shè)備信息
這篇文章主要介紹了java通過(guò)snmp協(xié)議獲取物理設(shè)備信息,snmp中文含義是簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議,可用完成對(duì)計(jì)算機(jī)、路由器和其他網(wǎng)絡(luò)設(shè)備的遠(yuǎn)程管理和監(jiān)視,本文我們是通過(guò)java程序來(lái)獲取,需要的朋友可以參考下2023-07-07