溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何利用Java實(shí)現(xiàn)索引庫(kù)相關(guān)的分頁(yè)、排序和聚合

發(fā)布時(shí)間:2021-07-26 21:29:45 來(lái)源:億速云 閱讀:272 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“如何利用Java實(shí)現(xiàn)索引庫(kù)相關(guān)的分頁(yè)、排序和聚合”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何利用Java實(shí)現(xiàn)索引庫(kù)相關(guān)的分頁(yè)、排序和聚合”吧!

學(xué)習(xí)計(jì)劃安排,利用Java代碼來(lái)實(shí)現(xiàn)對(duì)索引庫(kù)的各種操作:
通過(guò)自定義方法實(shí)現(xiàn)匹配查詢、范圍查詢。
原生的查詢代碼又是如何編寫(xiě)的?
最后還有聚合相關(guān)的代碼編寫(xiě)。
一、自定義方法
昨天學(xué)了最基礎(chǔ)的幾種增刪改查方法,但查詢?cè)趯?shí)際應(yīng)用中顯然沒(méi)這么簡(jiǎn)單。
比如用戶要匹配查詢,前幾天我們有學(xué)過(guò),有match匹配和term匹配兩種常用的方式。
這些在Java中又是哪些方法來(lái)對(duì)應(yīng)呢?
有原生的方法可以是使用,但是比較麻煩,這里使用springdata提供的自定義方法。
1自定義方法實(shí)現(xiàn)多種查詢方法
昨天有使用到findAll()方法,這是自帶的方法,看其語(yǔ)義也就能知道其實(shí)查詢所有數(shù)據(jù)。
但是很多時(shí)候并不是一個(gè)查詢所有方法就能解決的,所以需要自己自定義說(shuō)明。
①queryItemsByTitleMatchs
方法名一定要按照其格式來(lái),一看到也就很好理解,是根據(jù)Title這個(gè)字段匹配查詢。
其中后面還可以接“And”“Or”這些邏輯運(yùn)算,實(shí)現(xiàn)布爾查詢。
②queryItemsByPriceBetween
一樣的道理,范圍查詢也有其格式,也就是between這個(gè)單詞的使用。

如何利用Java實(shí)現(xiàn)索引庫(kù)相關(guān)的分頁(yè)、排序和聚合

2自定義方法的使用
①根據(jù)Title詞條匹配
直接調(diào)用自定義的match匹配方法,在參數(shù)中說(shuō)明要搜索的關(guān)鍵字是“小米手機(jī)”,這樣就能match匹配到和“小米手機(jī)”相關(guān)的數(shù)據(jù)了。
②根據(jù)price范圍查詢
直接調(diào)用自定義的范圍查詢方法,在參數(shù)中說(shuō)明價(jià)格區(qū)間是2000-4000,這樣也就能范圍查詢出這個(gè)價(jià)格區(qū)間相關(guān)的數(shù)據(jù)了。
3運(yùn)行方法,觀察結(jié)果
①“小米手機(jī)”匹配結(jié)果
這個(gè)前幾天專(zhuān)門(mén)說(shuō)明過(guò),因?yàn)閠itle這個(gè)字段類(lèi)型是text,是要分詞的,所以“小米手機(jī)”被分詞成了“小米”和“手機(jī)”。
只要是和上述分詞相關(guān)的數(shù)據(jù)都會(huì)被查詢出來(lái),所以“堅(jiān)果手機(jī)”也被查詢出來(lái)了。
②價(jià)格在2000-4000區(qū)間的數(shù)據(jù)
結(jié)果也就顯而易見(jiàn)了,如上圖所示。
二、原生的查詢
自定義方法雖然很簡(jiǎn)單,但有時(shí)候不能很好地實(shí)現(xiàn)業(yè)務(wù)需求,比如查詢條件過(guò)多時(shí)。
這個(gè)時(shí)候就需要結(jié)合官方提供的原生查詢了。
①創(chuàng)建查詢的構(gòu)造器
NativeSearchQueryBuilder也就是原生搜索查詢構(gòu)造器的意思,通過(guò)它也就可以添加各種查詢條件。
②添加查詢條件
withQuery():QueryBuilders說(shuō)明查詢
例子中是match匹配查詢,所以在Java中也就是matchQuery方法,參數(shù):title是字段,“小米手機(jī)”是該字段對(duì)應(yīng)的數(shù)據(jù)。
withPageable():PageRequest實(shí)現(xiàn)分頁(yè)
of()方法即可實(shí)現(xiàn)分頁(yè),其中頁(yè)面數(shù)從0頁(yè)開(kāi)始,每頁(yè)大小上述圖中指定的是2。
withSort():SortBuilders實(shí)現(xiàn)排序
fieldSort()方法說(shuō)明需要排序的字段。
order()方法說(shuō)明排序方式。
其可以鏈?zhǔn)骄幊滩煌5靥砑硬樵儣l件。
③再調(diào)用search方法完成查詢
使用自定義的itemRepository接口調(diào)用search()方法,同時(shí)說(shuō)明查詢條件,也就是原生的查詢只是說(shuō)明了下查詢條件。
查詢結(jié)果測(cè)試
match匹配“小米手機(jī)”,查詢數(shù)據(jù)有3條。
在分頁(yè)的時(shí)候就說(shuō)明了每頁(yè)顯示2條數(shù)據(jù),所以這里一共有2頁(yè)數(shù)據(jù)。
當(dāng)前顯示的是首頁(yè),也就是第0頁(yè)。
Java是一門(mén)面向?qū)ο缶幊陶Z(yǔ)言,不僅吸收了C++語(yǔ)言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語(yǔ)言具有功能強(qiáng)大和簡(jiǎn)單易用兩個(gè)特征。讀后感(https://www.yuananren.com)Java語(yǔ)言作為靜態(tài)面向?qū)ο缶幊陶Z(yǔ)言的代表,極好地實(shí)現(xiàn)了面向?qū)ο罄碚?,允許程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程 。Java具有簡(jiǎn)單性、面向?qū)ο?、分布式、健壯性、安全性、平臺(tái)獨(dú)立與可移植性、多線程、動(dòng)態(tài)性等特點(diǎn)   。Java可以編寫(xiě)桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等  。
總之:自定義方法之后,不需要我們寫(xiě)具體是如何查詢的了,可以直接使用,但是方法名需要遵循命名規(guī)范,如果不能正常使用,極有可能就是方法名格式不對(duì)。
三、原生的聚合
先對(duì)聚合做一個(gè)簡(jiǎn)單的回顧:
其實(shí)無(wú)外乎還是那核心4個(gè)步驟:
aggs說(shuō)明這是一個(gè)聚合。
給該聚合自定義一個(gè)名稱(chēng)。
說(shuō)明聚合類(lèi)型:桶有自己對(duì)應(yīng)到的各種類(lèi)型,度量也有自己對(duì)應(yīng)的各種類(lèi)型,上述例子中是桶里面的terms類(lèi)型。
說(shuō)明聚合字段:brand。也就是根據(jù)brand字段劃分成多個(gè)桶。
好,這是在Elasticsearch中的使用,那如何用Java代碼來(lái)操作它呢?
①創(chuàng)建構(gòu)造器
這個(gè)和原生的查詢一樣,都是使用該構(gòu)造器。
②添加聚合
這一段代碼就將聚合的三要素都說(shuō)清楚了。
聚合名叫什么?叫popularBrand。
聚合是什么類(lèi)型?terms()方法也就是terms類(lèi)型,不同的類(lèi)型在Java中對(duì)應(yīng)不同的方法。
聚合字段是哪個(gè)?field說(shuō)明是brand字段、
③得到聚合結(jié)果
使用elasticsearchTemplate查詢聚合,返回聚合結(jié)果。
④結(jié)果解析
這段代碼就有點(diǎn)復(fù)雜了,我們做一個(gè)對(duì)比。
利用kibana響應(yīng)的是一個(gè)json數(shù)據(jù),Java中的這段代碼其實(shí)也就是對(duì)json數(shù)據(jù)的解析。
getAggregations(),聚合是可以嵌套有多個(gè)的,只不過(guò)例子中只寫(xiě)了一個(gè)聚合。
get():根據(jù)聚合名找到需要的那個(gè)聚合。
getBuckets():找到對(duì)應(yīng)的桶數(shù)據(jù)。json數(shù)據(jù)中還有一些其它數(shù)據(jù),而我們自然需要的也就是buckets數(shù)據(jù)。
獲取桶中對(duì)應(yīng)的數(shù)據(jù)。
說(shuō)白了Java對(duì)聚合的解析其實(shí)也就是對(duì)json數(shù)據(jù)的解析過(guò)程,就算不是聚合,其它json數(shù)據(jù)的解析思路都是一樣的。

感謝各位的閱讀,以上就是“如何利用Java實(shí)現(xiàn)索引庫(kù)相關(guān)的分頁(yè)、排序和聚合”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何利用Java實(shí)現(xiàn)索引庫(kù)相關(guān)的分頁(yè)、排序和聚合這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI