基礎: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型別常見操作...