日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ES group分组聚合的坑

發(fā)布時(shí)間:2023/12/2 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ES group分组聚合的坑 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考鏈接:https://blog.csdn.net/u010454030/article/details/71762838

ES group分組聚合的坑

原來知道Elasticsearch在分組聚合時(shí)有一些坑但沒有細(xì)究,今天又看了遍順便做個(gè)筆記和大家分享一下。

我們都知道Elasticsearch是一個(gè)分布式的搜索引擎,每個(gè)索引都可以有多個(gè)分片,用來將一份大索引的數(shù)據(jù)切分成多個(gè)小的物理索引,解決單個(gè)索引數(shù)據(jù)量過大導(dǎo)致的性能問題,另外每個(gè)shard還可以配置多個(gè)副本,來保證高可靠以及更好的抗并發(fā)的能力。

將一個(gè)索引切分成多個(gè)shard,大多數(shù)時(shí)候是沒有問題的,但是在es里面如果索引被切分成多個(gè)shard,在使用group進(jìn)行聚合時(shí),可能會(huì)出現(xiàn)問題,這個(gè)在官網(wǎng)文檔里,描述也非常清楚

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#_shard_size_3

下面就針對(duì)官網(wǎng)的例子,描述下,group count如果有多個(gè)shard可能會(huì)出現(xiàn)的問題

假設(shè)我們現(xiàn)在,我們有一份商品的索引數(shù)據(jù),它有3個(gè)shard,每個(gè)shard的數(shù)據(jù)如下所示:

現(xiàn)在我們的需求是,按商品分組求top5的商品,es收到這個(gè)請(qǐng)求后,會(huì)去搜索這三個(gè)shard,然后子每個(gè)shard上面取top5,數(shù)據(jù)如下圖所示:

最后,將三個(gè)shard的top5的數(shù)據(jù),最后做一下匯聚然后最終排序取top5結(jié)果如下圖:

最后我們發(fā)現(xiàn)這個(gè)top5的結(jié)果,并不是100%精確的,只是一個(gè)近似精確的結(jié)果值:

Product A在所有top5的shard數(shù)據(jù)里面都存在,所以它的結(jié)果是精確的, Product C僅僅返回了 shard A 和 C里面的top5的數(shù)據(jù),所以這里顯示50是不精確的, Product C在shard B里面也存在,但是它在 top5里面沒有出現(xiàn),所以group后的結(jié)果實(shí)際上是有誤差的,再來看下 Product Z僅僅返回了2個(gè)shards的數(shù)據(jù) 因?yàn)榈谌齻€(gè)里面不存在,所以它的結(jié)果是準(zhǔn)確的,最后我們注意下 Product H實(shí)際上它的總數(shù)是44,橫跨三個(gè)shard 但是它在每個(gè)shard的top5里面并沒有出現(xiàn),所以最終的top5里面也沒有這條數(shù)據(jù),這樣看來最終的top5的值并不是100% 準(zhǔn)確的,這一點(diǎn)在設(shè)計(jì)和使用es的時(shí)候需要特別注意。

雖然我們可以調(diào)大返回size的個(gè)數(shù)來提高精確度,但是size個(gè)數(shù)的提升,也意味著有更多的數(shù)據(jù)會(huì)被返回,從而會(huì)導(dǎo)致檢索性能的下降,這一點(diǎn)是需要找到平衡點(diǎn)的。

那么有沒有方法避免這種不精確的統(tǒng)計(jì)的呢?

答案是有的,es官網(wǎng)文檔里面也提到,總共有2種:

第一種:

?聚合操作在單個(gè)shard時(shí)是精確的,也就是說我們索引的數(shù)據(jù)全部插入到一個(gè)shard的時(shí)候 它的聚合統(tǒng)計(jì)結(jié)果是準(zhǔn)確的。

第二種:

在索引數(shù)據(jù)的時(shí)候,使用route路由字段,將所有聚合的數(shù)據(jù)分布到同一個(gè)shard即可,這樣再聚合時(shí)也是精確的。

上面的兩種辦法都是可以解決的,第一種適合數(shù)據(jù)量不大的場(chǎng)景下,我們直接把數(shù)據(jù)放在一份索引里面,第二種辦法適合數(shù)據(jù)量比較大的場(chǎng)景下,我們通過業(yè)務(wù)字段將相同屬性的數(shù)據(jù)路由在同一個(gè)shard里面即可,具體使用哪個(gè)需要和具體的業(yè)務(wù)場(chǎng)景相結(jié)合。

總結(jié):

es雖然很強(qiáng)大,但是在一些場(chǎng)景下也是有局限的,比如上面提到的聚合分組的這個(gè)情況,或者聚合分組+分頁的情況,此外min,max,sum這些函數(shù)在多個(gè)shard中聚合結(jié)果是準(zhǔn)確的,count是近似準(zhǔn)確的,但是es能保證top 前幾的數(shù)據(jù)是精確的,這也是為什么搜索引擎一般都返回top n數(shù)據(jù)作為最終的返回結(jié)果,當(dāng)然上面提到那個(gè)例子,如果聚合的key本來就很少,那么它的聚合結(jié)果也是準(zhǔn)確的,比如按性別,月份聚合,因?yàn)檫@些返回的key,都是有限的,所以結(jié)果沒問題,但是一旦對(duì)分組的個(gè)數(shù)沒法確定,這種情況下出現(xiàn)問題的幾率就比較大,跨表或者跨分片聚合其實(shí)在任何db系統(tǒng)里面都會(huì)存在這種問題,所以我們應(yīng)該盡量在設(shè)計(jì)業(yè)務(wù)時(shí)就考慮到這種特殊情況,然后最終做特殊處理。

轉(zhuǎn)載于:https://www.cnblogs.com/txfsheng/p/9322141.html

總結(jié)

以上是生活随笔為你收集整理的ES group分组聚合的坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。