好的想法是十分钱一打,真正无价的是能够实现这些想法的人。

ES term聚合中文keyword字段跟相同的long类型聚合的速度差别为什么这么大

Elasticsearch | 作者 FFFrp | 发布于2020年11月16日 | 阅读数:201

ES版本 6.4.3
数据量 800G,1.8e个文档
需求:根据query对商品的某一中文字段进行聚合
遇到的问题:相同的DSL,对改中文字段进行term聚合响应时间在1s左右,同时还有一个字段是该中文字段的MD5后转成了一个10位数字的long类型字段,对该字段进行聚合响应时间竟然降到200ms左右,然后通过增加一个topHit子聚合拿到以前的中文值,整体的响应时间降低了70%。
疑惑:为什么keyword字段和long类型的字段term聚合速度差这么大,是不是中文的原因呢
已邀请:

laoyang360 - Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

我能想到的聚合本质走的是正排索引,可以以这个思路顺着思考对比

JiangJibo - 喊我雷锋

赞同来自:

 
正向索引是通过docId取_source的时候用的,和terms聚合没有的query阶段没有关系吧。我可以看看源码,不过近两天没有时间,等我过几天再来回复

FFFrp

赞同来自:

因为是更新写入很频繁的索引,看到这篇文章https://my.oschina.net/KasuganoShin/blog/4407521感觉是Global Ordinals导致的,后续尝试下开启
eager_global_ordinal测试下

FFFrp

赞同来自:

跟我类似的经历,https://elasticsearch.cn/question/1712
可以看下Wood大佬的回复 https://elasticsearch.cn/question/1797

JiangJibo - 喊我雷锋

赞同来自:

现在的问题是 "为什么keyword字段和long类型的字段term聚合速度差这么大",而不是高基数下的global oridinals 问题

guoyanbiao520

赞同来自:

{
"bool": {
"should": [
{
"term": {
"type": {
"value": "1",
"boost": 7.0
}
}
},
{
"term": {
"type": {
"value": "2",
"boost": 2.5
}
}
},
{
"term": {
"type": {
"value": "3",
"boost": 1.0
}
}
}
]
}
}
我这边测试这个查询语法,如果是long确实要比keyword速度查询要快,不过不是聚合查询,是直接搜索,也没有明白为什么

要回复问题请先登录注册