今天发现一个问题, Solr存储多值字段的时候, 需要显式的指定, 如CITY是单值字段, FACET_VALUES是多值字段, 需要这么写:
<fieldType name="pint" class="solr.IntPointField" docValues="true"/>
<fieldType name="pints" class="solr.IntPointField" docValues="true" multiValued="true"/>
<field name="CITY" type="pint"/>
<field name="FACET_VALUES" type="pints"/>
而ES定义时, 却只需要这么写:
"CITY": {
"type": "integer"
},
"FACET_VALUES": {
"type": "integer"
}
直觉是ES实现的时候默认都是定义的多值.
如何验证呢? 可以使用Luke来分别查看Solr和ES生成的Lucene索引.
先看Solr生成的Lucene索引的字段类型信息:
因为CITY和FACET_VALUES都是int类型, 唯一的区别就是单值和多值, 这里能看出来Lucene字段的类型确实不同,
这个是关于Flag的解释:
可以看出Dxxxxxx应该描述的是doc values的存储信息(这里标的是Dt, 应该是版本原因). Tx/x是point values.
所以CITY和FACET_VALUES的区别就在于存储的doc values类型不同.
CITY这个简称是number, FACET_VALUES这个的简称是srtnum.
结合一下Solr的官方文档:
可以看出根据官方描述, 单值用的NUMERIC类型, 多值用的SORTED_NUMERIC类型.
我们再来看一下Lucene源码, 找到这两个类型:
果然是两种doc values的类型.
好了, 到这里, 我们可以知道Solr里的单值和多值字段的底层区别是, 在Lucene存储时使用的doc values 类型不同.
再来看一下ES生成的索引.
很明显, CITY和FACET_VALUES的底层Lucene字段类型完全相同.
而且都是DsrtnumT4/1, 和Solr中的FACET_VALUES完全一致.
所以可以得出结论, ES存储数值字段的时候, 默认都是多值的, 所以不需要指定.
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。