一、數(shù)據(jù)聚合
1、聚合的分類
聚合(aggregations)可以實(shí)現(xiàn)對(duì)文檔數(shù)據(jù)的統(tǒng)計(jì)、分析、運(yùn)算。
聚合常見(jiàn)有三類:
-
桶聚合 Bucket:對(duì)文檔數(shù)據(jù)分組,并統(tǒng)計(jì)每組數(shù)量
- TermAggregation:按照文檔字段值分組(有點(diǎn)像mysql的group by)
- Date Histogram:按照日期階梯分組,例如一周為一組,或者一月一組
-
度量聚合 Metric:對(duì)文檔數(shù)據(jù)做計(jì)算,例如最大值,最小值,平均值等
- avg:求平均值
- max:求最大值
- min:求最小值
- stats:同時(shí)求max、min、avg、sum等
- 管道聚合 Pipeline:基于其他聚合結(jié)果再做聚合
參與聚合的字段類型必須是不可分詞的:
- keyword
- 數(shù)值
- 日期
- 布爾
2、DSL實(shí)現(xiàn)Bucket聚合
現(xiàn)在要統(tǒng)計(jì)所有數(shù)據(jù)中的酒店品牌有幾種,可以根據(jù)酒店品牌的名稱做聚合
aggs代表聚合,與query同級(jí),用aggs的時(shí)候query的作用是做返回,在query范圍下聚合
聚合必須要的三要素是:聚合名稱,聚合類型,聚合字段
可以配置的屬性:
- size:限制聚合結(jié)果的數(shù)量
- order:指定聚合結(jié)果排序方式
- field:指定聚合字段
3、DSL實(shí)現(xiàn)Metrics聚合
用了mertrics的stats,最大、最小、平均都求,然后再上面order指定根據(jù)平均值排序
4、RestAPI實(shí)現(xiàn)聚合
5、案例
實(shí)現(xiàn)對(duì)品牌、城市、星級(jí)的聚合
需求:搜索頁(yè)面的品牌、城市等信息不應(yīng)該是在頁(yè)面寫死,而是通過(guò)聚合索引庫(kù)中的酒店數(shù)據(jù)得來(lái)
要用map來(lái)接收,map的key就是城市或者星級(jí)這些,value就是對(duì)應(yīng)的聚合list
這樣就可以完成基本的功能了,但會(huì)有個(gè)問(wèn)題:
像這樣,如果用戶帶著條件來(lái)查詢的話,比如帶著虹橋來(lái)查詢,我們給用戶篩選條件聚合還是根據(jù)全局索引聚合的,會(huì)先很多別的城市,這些城市沒(méi)有虹橋如果點(diǎn)擊就出問(wèn)題了。所以我們要想辦法改成對(duì)用戶的輸入條件聚合
其實(shí)就是在聚合條件上加查詢條件,限制聚合的范圍。
?二、自動(dòng)補(bǔ)全
1、拼音分詞器
要實(shí)現(xiàn)根據(jù)字母做補(bǔ)全,就必須對(duì)文檔按照拼音分詞。
直接去下載拼音分詞器的插件,然后analyzer選pinyin就行
2、自定義分詞器
拼音分詞器的問(wèn)題:分的次都是單個(gè)的沒(méi)有什么用,ru、jia這種沒(méi)用的,還有就是全部第一個(gè)小寫,而且我們大多數(shù)情況還是用漢字進(jìn)行分詞,而不是拼音,我們要保留漢字分詞
這個(gè)時(shí)候就必須要自定義分詞器
要自定義分詞器,必須先了解分詞器的組成:
- character filters:在tokenizer之前對(duì)文本進(jìn)行處理,例如刪除字符、替換字符
- tokenizer:將文本按照一定的規(guī)則切割成詞條(tern),例如keyword就是不分詞
- tokenizer filter:將tokenizer輸出的詞條做進(jìn)一步處理,例如大小寫轉(zhuǎn)化,同義詞處理,拼音處理
所以,我們知道pinyin分詞器不會(huì)進(jìn)行分詞,那么我們就可以先用ik分詞器先分詞,再用pinyin分詞器做處理,就可以得到pinyin的分詞了
但是拼音分詞器會(huì)對(duì)每個(gè)字的首字母結(jié)合的還有會(huì)去中文,這兩個(gè)我們要優(yōu)化
?我們?cè)趧?chuàng)建索引的時(shí)候,可以用自定義分詞器,但是在搜索的時(shí)候,就不能使用這個(gè)分詞器了
?
3、completion suggester查詢
es提供了completion suggester查詢來(lái)實(shí)現(xiàn)自動(dòng)補(bǔ)全功能。這個(gè)查詢會(huì)匹配以用戶輸入內(nèi)容開頭的詞條并返回。為了提高補(bǔ)全查詢的效率,對(duì)文檔中字段的類型有一些約束:
參與補(bǔ)全查詢的字段必須是completion類型(專門做自動(dòng)補(bǔ)全查詢的類型)
字段的內(nèi)容一般是用來(lái)補(bǔ)全的多個(gè)詞條形成的數(shù)組(右圖,如果我們輸入的s,那么可以補(bǔ)全這兩個(gè)數(shù)據(jù),但如果我們輸入w,沒(méi)有等多個(gè)詞條的話就不會(huì)補(bǔ)全,所以分多個(gè)詞條更人性化)
前面是品牌,后面是產(chǎn)品的名稱,一個(gè)產(chǎn)品的都存在一個(gè)數(shù)組里
4、案例實(shí)戰(zhàn)
實(shí)現(xiàn)hotel索引庫(kù)的自動(dòng)補(bǔ)全、拼音搜索功能
思路:
- 修改hotel索引庫(kù)結(jié)構(gòu),設(shè)置自定義拼音分詞器
- 修改索引庫(kù)的name、all字段,使用自定義分詞器
- 索引庫(kù)添加一個(gè)新字段suggestion,類型為completion類型,使用自定義的分詞器
- 給HotelDoc類添加suggestion字段,內(nèi)容包含brand、business
- 重新導(dǎo)入數(shù)據(jù)到hotel庫(kù)
首先,我們先修改索引庫(kù)的數(shù)據(jù)結(jié)構(gòu),要多加一個(gè)completion_analyzer分詞器,這個(gè)分詞器是keyword,代表不分詞,因?yàn)槲覀儏⑴c自動(dòng)補(bǔ)全的都是一個(gè)個(gè)的詞條,這些詞條已經(jīng)是最小了不需要再分詞了,然后再用拼音分詞器變成拼音就好了
all的創(chuàng)建索引庫(kù)用的是自定義的拼音結(jié)合的分詞器,搜索的分詞器就用ik
因?yàn)檫@個(gè)suggestion是多個(gè)類型的詞條組成的數(shù)組,所以用list,然后品牌和商圈都可以做自動(dòng)補(bǔ)全的內(nèi)容。把想要做自動(dòng)動(dòng)補(bǔ)全的都可以加進(jìn)去。但是這個(gè)商圈,business可能有多個(gè)是用/分割開的,所以我們要進(jìn)一步進(jìn)行拆分
然后加入,現(xiàn)在就可以搜索一下試試了
然后我們就要用java的客戶端來(lái)操作了?
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-429339.html
這樣就能實(shí)現(xiàn)自動(dòng)補(bǔ)全功能了?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-429339.html
到了這里,關(guān)于Elasticsearch聚合、自動(dòng)補(bǔ)全 | 黑馬旅游的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!