es統計有多少個分組_ES 24 - 如何通過Elasticsearch進行聚合檢索 (分組統計)

1 普通聚合分析

1.1 直接聚合統計

(1) 計算每個tag下的文檔數量, 請求語法:

GET book_shop/it_book/_search

{

"size": 0, // 不顯示命中(hits)的所有文檔信息

"aggs": {

"group_by_tags": {// 聚合結果的名稱, 需要自定義(復制時請去掉此注釋)

"terms": {

"field": "tags"

}

}

}

}

(2) 發生錯誤:

說明: 索引book_shop的mapping映射是ES自動創建的, 它把tag解析成了text類型, 在發起對tag的聚合請求后, 將拋出如下錯誤:

{

"error": {

"root_cause": [

{

"type": "illegal_argument_exception",

"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [tags] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."

}

],

"type": "search_phase_execution_exception",

"reason": "all shards failed",

"phase": "query",

"grouped": true,

"failed_shards": [......]

},

"status": 400

}

(3) 錯誤分析:

錯誤信息: Set fielddata=true on [xxxx] ......

錯誤分析: 默認情況下, Elasticsearch 對 text 類型的字段(field)禁用了 fielddata;

text 類型的字段在創建索引時會進行分詞處理, 而聚合操作必須基于字段的原始值進行分析;

所以如果要對 text 類型的字段進行聚合操作, 就需要存儲其原始值 —— 創建mapping時指定fielddata=true, 以便通過反轉倒排索引(即正排索引)將索引數據加載至內存中.

(4) 解決方案一: 對text類型的字段開啟fielddata屬性:

將要分組統計的text field(即tags)的fielddata設置為true:

PUT book_shop/_mapping/it_book

{

"properties": {

"tags": {

"type": "text",

"fielddata": true

}

}

}

再次統計, 得到的結果如下:

{

"took": 153,

"timed_out": false,

"_shards": {

"total": 5,

"successful": 5,

"skipped": 0,

"failed": 0

},

"hits": {

"total": 4,

"max_score": 0.0,

"hits": []

},

"aggregations": {

"group_by_tags": {

"doc_count_error_upper_bound": 0,

"sum_other_doc_count": 6,

"buckets": [

{

"key": "java",

"doc_count": 3

},

{

"key": "程",

"doc_count": 2

},

......

]

}

}

}

(5) 解決方法二: 使用內置keyword字段:

開啟fielddata將占用大量的內存.

Elasticsearch 5.x 版本開始支持通過text的內置字段keyword作精確查詢、聚合分析:

GET shop/it_book/_search

{

"size": 0,

"aggs": {

"group_by_tags": {

"terms": {

"field": "tags.keyword"// 使用text類型的內置keyword字段

}

}

}

}

1.2 先檢索, 再聚合

(1) 統計name中含有“jvm”的圖書中每個tag的文檔數量, 請求語法:

GET book_shop/it_book/_search

{

"query": {

"match": { "name": "jvm" }

},

"aggs": {

"group_by_tags": { // 聚合結果的名稱, 需要自定義. 下面使用內置的keyword字段:

"terms": { "field": "tags.keyword" }

}

}

}

(2) 響應結果:

{

"took" : 7,

"timed_out" : false,

"_shards" : {

"total" : 5,

"successful" : 5,

"skipped" : 0,

"failed" : 0

},

"hits" : {

"total" : 1,

"max_score" : 0.64072424,

"hits" : [

{

"_index" : "book_shop",

"_type" : "it_book",

"_id" : "2",

"_score" : 0.64072424,

"_source" : {

"name" : "深入理解Java虛擬機:JVM高級特性與最佳實踐",

"author" : "周志明",

"category" : "編程語言",

"desc" : "Java圖書領域公認的經典著作",

"price" : 79.0,

"date" : "2013-10-01",

"publisher" : "機械工業出版社",

"tags" : [

"Java",

"虛擬機",

"最佳實踐"

]

}

}

]

},

"aggregations" : {

"group_by_tags" : {

"doc_count_error_upper_bound" : 0,

"sum_other_doc_count" : 0,

"buckets" : [

{

"key" : "Java",

"doc_count" : 1

},

{

"key" : "最佳實踐",

"doc_count" : 1

},

{

"key" : "虛擬機",

"doc_count" : 1

}

]

}

}

}

1.3 擴展: fielddata和keyword的聚合比較

為某個 text 類型的字段開啟fielddata字段后, 聚合分析操作會對這個字段的所有分詞分別進行聚合, 獲得的結果大多數情況下并不符合我們的需求.

使用keyword內置字段, 不會對相關的分詞進行聚合, 結果可能更有用.

—— 推薦使用text類型字段的內置keyword進行聚合操作.

2 嵌套聚合

2.1 先分組, 再聚合統計

(1) 先按tags分組, 再計算每個tag下圖書的平均價格, 請求語法:

GET book_shop/it_book/_search

{

"size": 0,

"aggs": {

"group_by_tags": {

"terms": { "field": "tags.keyword" },

"aggs": {

"avg_price": {

"avg": { "field": "price" }

}

}

}

}

}

(2) 響應結果:

"hits" : {

"total" : 3,

"max_score" : 0.0,

"hits" : [ ]

},

"aggregations" : {

"group_by_tags" : {

"doc_count_error_upper_bound" : 0,

"sum_other_doc_count" : 0,

"buckets" : [

{

"key" : "Java",

"doc_count" : 3,

"avg_price" : {

"value" : 102.33333333333333

}

},

{

"key" : "編程語言",

"doc_count" : 2,

"avg_price" : {

"value" : 114.0

}

},

......

]

}

}

2.2 先分組, 再統計, 最后排序

(1) 計算每個tag下圖書的平均價格, 再按平均價格降序排序, 查詢語法:

GET book_shop/it_book/_search

{

"size": 0,

"aggs": {

"all_tags": {

"terms": {

"field": "tags.keyword",

"order": { "avg_price": "desc" } // 根據下述統計的結果排序

},

"aggs": {

"avg_price": {

"avg": { "field": "price" }

}

}

}

}

}

(2) 響應結果:

與#2.1節內容相似, 區別在于按照價格排序顯示了.

2.3 先分組, 組內再分組, 然后統計、排序

(1) 先按價格區間分組, 組內再按tags分組, 計算每個tags組的平均價格, 查詢語法:

GET book_shop/it_book/_search

{

"size": 0,

"aggs": {

"group_by_price": {

"range": {

"field": "price",

"ranges": [

{ "from": 00, "to": 100 },

{ "from": 100, "to": 150 }

]

},

"aggs": {

"group_by_tags": {

"terms": { "field": "tags.keyword" },

"aggs": {

"avg_price": {

"avg": { "field": "price" }

}

}

}

}

}

}

}

(2) 響應結果:

"hits" : {

"total" : 3,

"max_score" : 0.0,

"hits" : [ ]

},

"aggregations" : {

"group_by_price" : {

"buckets" : [

{

"key" : "0.0-100.0", // 區間0.0-100.0

"from" : 0.0,

"to" : 100.0,

"doc_count" : 1, // 共查找到了3條文檔

"group_by_tags" : { // 對tags分組聚合

"doc_count_error_upper_bound" : 0,

"sum_other_doc_count" : 0,

"buckets" : [

{

"key" : "Java",

"doc_count" : 1,

"avg_price" : {

"value" : 79.0

}

},

......

]

}

},

{

"key" : "100.0-150.0",

"from" : 100.0,

"to" : 150.0,

"doc_count" : 2,

"group_by_tags" : {

"doc_count_error_upper_bound" : 0,

"sum_other_doc_count" : 0,

"buckets" : [

{

"key" : "Java",

"doc_count" : 2,

"avg_price" : {

"value" : 114.0

}

},

......

}

]

}

}

]

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538811.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python程序運行原理_談談 Python 程序的運行原理

因為我的個人網站 restran.net 已經啟用,博客園的內容已經不再更新。請訪問我的個人網站獲取這篇文章的最新內容,談談 Python 程序的運行原理 這篇文章準確說是『Python 源碼剖析』的讀書筆記,整理完之后才發現很長,那就將就看吧。…

3.JDK和JRE和JVM的區別

JDK --Java Development Kit --java 開發工具包 JRE --Java Runtime Environment --java運行時環境 JVM --Java Virtual Machine --java虛擬機 ------------- 更多的Java,Angular,Android,大數據,J2EE,Python…

緩存cache

由于Django是動態網站,所有每次請求均會去數據進行相應的操作,當程序訪問量大時,耗時必然會更加明顯,最簡單解決方式是使用:緩存,緩存將一個某個views的返回值保存至內存或者memcache中,5分鐘內…

微信小程序 等待幾秒、_微信小程序—setTimeout定時器的坑

背景實驗室需要將項目的app搬到微信的小程序上,終于知道為什么程序員是手藝人了,只要有需求,就要想方設法去填充這種需求,去年是小程序的元年了可以說,去年冬天一個叫跳一跳的小程序游戲出現在我的微信中,當…

linux中斷處理模式,Linux在保護模式下的中斷處理分析.pdf

Linux在保護模式下的中斷處理分析.pdfLinux 在保護模式下的中斷處理分析劉萬里 楊 斌(西南交通大學計算機與通信工程學院,成都 610031)E-mail:awan摘 要 該文以 80x86 保護模式下的中斷處理方法為基礎,針對 Linux 在實時嵌入式系統中的具體應…

python3.7是什么_Python 3.7 有什么新變化

idlelib 與 IDLE 多個對自動補全的修正。 (由 Louie Lu 在 bpo-15786 中貢獻。) Module Browser (在 File 菜單中,之前稱為 Class Browser) 現在會在最高層級函數和類之外顯示嵌套的函數和類。 (由 Guilherme Polo, Cheryl Sabell…

4.JVM簡述

JVM是一種規范。 就是一個虛擬的用于執行bytecodes字節碼的計算機 可以用軟件來實現,如IBM,SUN,BEA等按照這個規范實現,可以實現比SUN公司更好的JVM,我們自己也可以實現一個。 可以使用硬件來實現,如sun與intel公司研發java的芯…

python ssh shell交互_使用Paramiko在Python上用ssh實現交互式shell?

我想編寫一個程序(在Windows 7上的Python 3.x中),它通過ssh在遠程shell上執行多個命令.在查看paramikos的exec_command()函數之后,我意識到它不適合我的用例(因為在執行命令后通道被關閉),因為命令依賴于環境變量(由先前的命令設置)并且不能連接到一個exec_command()調用,因為它…

linux7如何進入緊急模式,CentOS7開機進入緊急模式EmergencyMode的解決辦法

iOS Runtime學習筆記Associated Objects: interface NSObject (AssociatedObject) property (nonatomic, strong) id associat ...Vim,極簡使用教程,讓你瞬間脫離鍵鼠切換的痛苦注:看大家對Vim仇恨極大,其實它只是一種文本操作方式,可以減少鍵鼠的切換,從…

用pycharm寫python_如何利用pyCharm編寫和運行python文件

在安裝python環境后,通常可以利用IDE pyCharm來編譯我們的python文件。創建一個python文件夾,用pyCharm打開文件夾,在文件夾中新建一個python文件demo.py 也許你知道用cmd中的python指令 python demo.py去運行這個文件,但是如何在…

5.JDK環境配置

下載 進入Oracle官網下載,點擊進入 安裝 一路下一步。記住安裝到哪里了。 配置環境變量 JAVA_HOME 剛才的java安裝目錄 PATH %JAVA_HOME%\bin PATH里配置多個用英文的分號; 分隔。 *classpath,jdk5.0以上可以不用配置了 測試 windows下&#xf…

GBK 編碼

GBK編碼范圍:8140-FEFE,漢字編碼范圍見第二節:碼位分配及順序。 GBK編碼,是對GB2312編碼的擴展,因此完全兼容GB2312-80標準。GBK編碼依然采用雙字節編碼方案,其編碼范圍:8140&#x…

less webpack 熱更新_webpack---less+熱更新 使用

最近嘗試用less寫界面,webpack進行打包,然后發現每次修改less時都需要重新執行webpack打包一下,于是就想到了webpack熱更新這個功能。一、使用lessless是一門css預處理語言,它是拓展了css,增加了變量,Mixin等等。使用l…

6.第一個程序Hello World

新建文件夾 在C盤新建個文件夾 mycode。注意不要用中文。 新建java文件 1、顯示隱藏文件名。 2、右鍵新建文本文件 3、重命名為 Welcome.java。(首字母必須大寫。如果不顯示隱藏文件名,會是Welcome.java.txt不是java文件) 4、編寫代碼 p…

pythonstdin_python 筆試輸入:sys.stdin.readline和input

①:輸入一行數據并輸 出兩種方法 # 輸入一行數據并輸出 import sys # 方法一: str1 input() print(input 輸入:,str1,len,len(str1)) print(循環遍歷輸入得到輸入的每個字符的ascii碼如下:) for i in str1: print(ord(i)) # 方法二&#xff…

c語言字符串二維數組的動態分配應,C語言中動態分配二維數組復習過程.doc

C語言中動態分配二維數組復習過程.docC語言中動態分配二維數組在C中動態分配內存的,對于單個變量,字符串,一維數組等,都是很容易的。C中動態分配二維數組的方法,很少有C語言書中描述,我查找了有的C語言書中…

7.Java常用開發工具

文本編輯器 任意選一款 UltraEdit EditPlus notepad 集成開發環境 IDE:Integrated Development Environment --JBulider (基本淘汰) --Eclipse 普遍使用。https://www.eclipse.org/downloads/ --NetBeans ------------- 更多的Java&a…

python京東商品_Python爬取京東的商品分類與鏈接

前言本文主要的知識點是使用Python的BeautifulSoup進行多層的遍歷。如圖所示。只是一個簡單的哈,不是爬取里面的隱藏的東西。示例代碼from bs4 import BeautifulSoup as bsimport requestsheaders {"host": "www.jd.com","User-Agent&quo…

python加入中小學課程_【python即將進入中學課堂,編程從小抓起,竟然在這幾點上應驗了】- 環球網校...

【摘要】我們都知道,不論是我們使用的app,還是各種各樣的游戲,小程序,都離不開編程軟件的貢獻,其中python占據了半壁江山,隨著大家對python的重視,python即將進入中學課堂,這究竟是好…

用動態規劃算法求解最少硬幣問題 c語言,動態規劃算法求解硬幣找零問題

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓看著這代碼怎么這么熟悉。package 動態規劃找零;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);int change;change scan.nextInt();int[] coins …