elasticsearch text型別聚合操作

2021-10-01 18:02:27 字數 1874 閱讀 2854

基礎:es版本6.0

text型別時分析型型別,預設是不允許進行聚合操作的。如果想對text型別的域(就是字段、屬性的意思)進行聚合操作,需要設定其fielddata為true。但這樣設定完了只是滿足聚合要求了,而無法滿足精準聚合,就是說text型別還是會進行分詞分析過程,導致針對乙個text型別的域進行聚合的時候,可能會不準確。因此還需要設定此字段的fileds子域為keyword型別,經過這兩處設定之後就可以進行精準聚合操作了。

下面是測試過程。

首先建立乙個索引my_index,並指定其型別名為my_type(6版本每個索引只支援乙個type),並為其設定了對映規則:testtext域的型別為text型別

put my_index}}

}}

接下來插入一條文件

post my_index/my_type

接下來嘗試分桶聚合操作

post /my_index/my_type/_search}}

}

結果報錯如下

],"type": "search_phase_execution_exception",

"reason": "all shards failed",

"phase": "query",

"grouped": true,

"failed_shards": [}],

"caused_by": }},

"status": 400

}

報錯意思是說,預設情況下,在text型別的字段上禁用fielddata,因為會占用很大的記憶體。如果實在想對text型別進行聚合,可以在對應欄位上設定fielddata=true,以便通過取消反轉索引將fielddata載入到記憶體中。要實現聚合,建議直接設定型別為keyword而不是text。

那麼我們先不管佔不佔記憶體,先按照提示設定fielddata=true試試

}}設定完之後再次進行之前的聚合操作,得到如下結果

,

"hits": ,

"aggregations": ,]}

}}

可以看到對testtext欄位進行聚合操作後得到了兩個桶,第乙個桶的值為「v1」,第二個桶的值為「v2」,且都各自對應乙個文件。分析一下,我們只存了乙個文件,testtext值為「v1/v2」。因為text會進行分詞,預設使用的分詞器會把「/」省略掉,倒排索引後生成「v1」,「v2」兩個token,因此對testtext進行聚合操作時,會分別匹配「v1」,「v2」兩個token而不是輸入的「v1/v2」。所以這就是開頭說的對text型別字段進行聚合可能會不準確。

接下來解決不準確的問題!

為testtext欄位設定keyword型別的子字段}}

}} 接下來測試聚合操作,注意這時候是對testtext欄位的子字段subfield進行聚合(實際上子字段的值就是父字段的值,因此可以代替父欄位進行聚合),但如果不新增新的文件的話,會發現沒有結果,因為舊文件已經按照舊的對映規則建立了倒排索引了,所以新的聚合不會查到資料。我這裡直接新增新的文件再進行聚合。

post my_index/my_type

post /my_index/my_type/_search}}

}

插入了新的值「v3/v4」,並對subfield進行聚合,結果如下

,

"hits": ,

"aggregations": ]}

}}

可以看到只有乙個桶,且值為輸入的值「v3/v4」,這就實現精確聚合了。

但還是需要注意,這樣會消耗記憶體,建議對需要聚合的字串字段設定為keyword型別。

ES實現nested型別聚合以及子聚合排序

針對日銷量索引,需要分析品牌 品類等日銷量趨勢,以及近7天,近30天等銷量靠前的品牌 品類等。涉及到 nested 聚合,以及聚合排序。指定日期範圍 趨勢,銷量趨勢查詢排序 品類近7天銷量 post goods sku sales2 v20200109 search aggs aggs aggs a...

Redis之sorted sets型別及操作

sorted set是set的乙個公升級版本,它在set的基礎上增加了乙個順序屬性,這一屬性在新增修改元素的時候可以指定,每次指定後,zset會自動重新按新的值調整順序。可以理解為有兩列的mysql表,一列存value,一列存順序。操作中key理解為zset的名字。和set一樣sorted set也...

golang redis之set型別簡單操作

1 安裝redigo go get github.com garyburd redigo redis2 連線redis 3 命令執行 n,err c.do sadd key value 寫 result,err redis.values c.do smembers key 讀 4 set型別常見操作...