怎么又是你

有关于ES里头terms聚合的问题

Elasticsearch | 作者 Charele | 发布于2023年07月16日 | 阅读数:1238

111.PNG

 
如图,比如我对name字段(keyword类型)做一个terms聚合,
就会执行里,,,
 如果说蓝色就是“这个段里面”关于name的全局ord列表,
正是我们执行聚合所需要的东东。
 
 那这个得来的红色的singleValues又代表什么意思呢?“单值”?
 
它的优先级好像比上面蓝色东东高,
 
如果不是null,就用它(不用管蓝色东东)
如果它是null,就只能用上面那个蓝色东东了
已邀请:

Ombres

赞同来自:

是的,是单值,对于单值和多值有不同的处理方式。
可以看看lucene中SortedSetDocValues和SortedDocValues 
es对于字符串统一使用SortedSetDocValues ,不像solr一样需要主动设置单值或多值

Charele - Cisco4321

赞同来自:

这个在Lucene的含义我理解,
比如一个文档,我插入两个相同名称的值,
111.PNG

那么等于说,(包含这个文档的)段中,关于"name"这个字段的DV就是多值的。
用上面那个“取单值”的方法,取出来就是null(因为它不是单值的)
 
 
但现在的代码,是在ES里面,情况是不一样的,
比如我插入的文档,相应的字段是keyword类型,
绝对不可能出现上面Lucene代码演示的情况。
因为插入ES一个文档就是一个Lucene文档,里面只有一个SortedSetDocValuesField值。
 
PS:text类型的不讨论。
 
 
 
 
 

Charele - Cisco4321

赞同来自:

111.PNG

222.PNG

 
ES7里,keyword类型(没用数组类型),所有的段,本身都是单值的。
 
  比如段1有两个文档("aaa", "bbb"),段2只有一个文档("bbb")
因为段1有全部数据,所以会在蓝色处返回,在紫色处取单值,是成功的。
所以这里段1是单值的处理。
 
段2,因为只有部分数据,所以它里面的ord值,要"global化“,
global化的手段,就是把它包装成一个GlobalOrdinalMapping类,
所以在紫色处,取单值,是不成功的
(取单值成功的前提是,它得是一个SingletonSortedSetDocValues类)
 所以,尽管段2,本身是单值的。但在这里,它是被视作多值来处理的
 
这个段2,就是我刚开始困惑的原因,明明是单值,结果却被当做多值。
ES8里做了修正

Charele - Cisco4321

赞同来自:

如果用keyword数组类型,
用了数组类型,一个段本身就是“多值”。
好像分两种情况,这个段有全量数据,和只有部分数据。
 
1 有全量数据,蓝色处返回。因为它本身是多值,所以紫色处取单值,不成功
2 只有部分数据,包装成GlobalOrdinalMapping类。紫色处取单值,不成功

要回复问题请先登录注册