你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
输入关键字进行搜索
搜索:
没有找到相关结果
Ombres
赞同来自:
Charele - Cisco4321
要回复问题请先登录或注册
Cisco4321
4 个回复
Ombres
赞同来自:
可以看看lucene中SortedSetDocValues和SortedDocValues
es对于字符串统一使用SortedSetDocValues ,不像solr一样需要主动设置单值或多值
Charele - Cisco4321
赞同来自:
比如一个文档,我插入两个相同名称的值,
那么等于说,(包含这个文档的)段中,关于"name"这个字段的DV就是多值的。
用上面那个“取单值”的方法,取出来就是null(因为它不是单值的)
但现在的代码,是在ES里面,情况是不一样的,
比如我插入的文档,相应的字段是keyword类型,
绝对不可能出现上面Lucene代码演示的情况。
因为插入ES一个文档就是一个Lucene文档,里面只有一个SortedSetDocValuesField值。
PS:text类型的不讨论。
Charele - Cisco4321
赞同来自:
ES7里,keyword类型(没用数组类型),所有的段,本身都是单值的。
比如段1有两个文档("aaa", "bbb"),段2只有一个文档("bbb")
因为段1有全部数据,所以会在蓝色处返回,在紫色处取单值,是成功的。
所以这里段1是单值的处理。
段2,因为只有部分数据,所以它里面的ord值,要"global化“,
global化的手段,就是把它包装成一个GlobalOrdinalMapping类,
所以在紫色处,取单值,是不成功的
(取单值成功的前提是,它得是一个SingletonSortedSetDocValues类)
所以,尽管段2,本身是单值的。但在这里,它是被视作多值来处理的
这个段2,就是我刚开始困惑的原因,明明是单值,结果却被当做多值。
ES8里做了修正
Charele - Cisco4321
赞同来自:
用了数组类型,一个段本身就是“多值”。
好像分两种情况,这个段有全量数据,和只有部分数据。
1 有全量数据,蓝色处返回。因为它本身是多值,所以紫色处取单值,不成功
2 只有部分数据,包装成GlobalOrdinalMapping类。紫色处取单值,不成功