搜索条件命中的数据越多,聚合请求的时间越长。搜索的字段,不一样的值越多,聚合请求时间越长。例如性别字段,通常仅有3个取值(男、女、未知),这种属于取值少的。像邮箱字段,值非常多,上亿个。这种就属于高基数字段。同样的搜索条件,高基数字段的聚合耗时会多非常多!
其中比较好的有这几篇文章。
抽样聚合方案
1.es原生抽样聚合
参考文档:Sampler aggregation | Elasticsearch Guide [7.11] | Elastic
ES中的抽样聚合,意思是只对高质量的数据做聚合。比如,指定搜索条件,该搜索条件命中的数据为100W,对这100W数据,根据相关性分数排序。然后对这topK的数据做聚,比如每个shard上取200条评分最高的数据,去聚合。这就是ES sampler aggregation的含义。
2.es pre–filter机制
参考文档:Elasticsearch的search之_shards skipped之谜_布道的博客-CSDN博客__shards skipped
3.es在检索过程中指定分片
GET index_name/_search?preference=_shards:0
抽样抽分片的思路,只每次固定只检测其中一个分片。例如我们的索引一共300G,每个分片30G,一共有10个分片。在检索的过程中,只对其中一个分片做检索和聚合。其最终的聚合结果,根据我们的测试来看,效果还是非常不错的。聚合结果的分布情况和本来的terms聚合相差不大。性能也能提升个几倍。注意这种方式,聚合结果是近似的,并不是完全准确的(ES本身的聚合解结果就不是100%精准的)。
在大数据随机分布的情况下。在搜索命中大量数据情况下,其结果分布也是满足正态分布的。注意在搜索结果命中的结果集越多,其结果越符合正态分布,其聚合结果越接近标准值(原生terms聚合)。这里有一个值,一个经验值,在搜索提交条件命中大于10000的时候,可以用抽样,结果偏差不大。
注意,这里具体抽哪一个分片是有说法的。我们要考虑一个问题,同一个搜索条件,聚合结果应该是一致的。这里可以将搜索条件进行md5,然后取hash值,然后将hash值模上分片总数。这里只是一个思路。
ES官方的抽样聚合说明
抽样方案对比测试
对比测试了三种聚合分析的方式,其中包含了terms、sampler terms、和shard抽样(假如有10个shard,只对其中一个shard做搜索)
先说测试结论
抽取分片,召回的结果和标准结果偏差不大。
抽取分片,时间花费上,性能提升3-5倍。资源花费为分片总数分之一。
响应时间对比如下
检索条件 |
响应时间 |
|||
(北京 AND 暴雨) |
terms |
4561 7694 |
|
|
shard抽样 |
1423 2785 |
效果最好 |
||
5650 3663 |
效果没有太明显 |
召回结果对比如下
terms(结果) |
抽取一个分片 |
|||
地区 |
4224 |
446 |
2094 |
|
3772 |
375 |
– |
|
|
3605 |
342 |
– |
|
|
3503 |
378 |
1942 |
|
|
2781 |
294 |
1525 |
|
|
大雨 |
2395 |
236 |
– |
|
暴雨 |
2394 |
264 |
2454 |
|
气温 |
2079 |
212 |
915 |
|
局地 |
1851 |
199 |
1055 |
|
1741 |
187 |
– |
|
|
降雨 |
– |
– |
1111 |
|
北京 |
– |
– |
827 |
|
巴西 |
– |
– |
801 |
|
灾害 |
– |
– |
801 |
|
检索语句
这里使用的是query_string 检索语法。对比标准的terms聚合,官方的simple抽样,和抽分片。
"query": {
"query_string": {
"query": """北京 AND 暴雨""",
"fields": [
"content^1.0",
"title^1.0"
],
"type": "phrase",
"tie_breaker": 1,
"default_operator": "and",
"max_determinized_states": 10000,
"enable_position_increments": true,
"fuzziness": "AUTO",
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"phrase_slop": 0,
"escape": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 1
}
}
全部测试结果原始数据
搜索范围 |
搜索条件 |
聚合方式 |
耗时情况ms |
返回结果 |
(北京 AND 暴雨) |
terms |
4561 7694 |
[ { “key” : “地区”, }, { }, { }, { }, { }, { “key” : “大雨”, }, { “key” : “暴雨”, }, { “key” : “气温”, }, { “key” : “局地”, “doc_count” : 1851 }, { “key” : “工作”, “doc_count” : 1741 } ] |
|
terms |
5650 3663 |
[ { “key” : “暴雨”, “doc_count” : 2454 }, { “key” : “地区”, “doc_count” : 2094 }, { “key” : “天气“, “doc_count” : 1942 }, { “key” : “部分“, “doc_count” : 1525 }, { “key” : “降雨”, “doc_count” : 1111 }, { “key” : “局地”, “doc_count” : 1055 }, { “key” : “气温”, “doc_count” : 915 }, { “key” : “北京”, “doc_count” : 827 }, { “key” : “巴西”, “doc_count” : 801 }, { “key” : “灾害”, “doc_count” : 801 } ] |
||
terms + |
1423 2785 |
[ { “key” : “地区”, “doc_count” : 446 }, { “key” : “天气“, “doc_count” : 378 }, { “key” : “中国”, “doc_count” : 375 }, { “key” : “发展“, “doc_count” : 342 }, { “key” : “部分“, “doc_count” : 294 }, { “key” : “暴雨”, “doc_count” : 264 }, { “key” : “大雨”, “doc_count” : 236 }, { “key” : “气温”, “doc_count” : 212 }, { “key” : “局地”, “doc_count” : 199 }, { “key” : “工作”, “doc_count” : 187 } ] |
原文地址:https://blog.csdn.net/star1210644725/article/details/134753932
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_29802.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!