前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Solr与ES多值存储的区别

Solr与ES多值存储的区别

原创
作者头像
叫我家宝
修改2023-04-06 15:53:13
4980
修改2023-04-06 15:53:13
举报
文章被收录于专栏:搜索引擎技术研讨

问题描述

今天发现一个问题, Solr存储多值字段的时候, 需要显式的指定, 如CITY是单值字段, FACET_VALUES是多值字段, 需要这么写:

代码语言:txt
复制
<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定义时, 却只需要这么写:

代码语言:txt
复制
"CITY": {
	"type": "integer"
},

"FACET_VALUES": {
	"type": "integer"
}

直觉是ES实现的时候默认都是定义的多值.

如何验证呢? 可以使用Luke来分别查看Solr和ES生成的Lucene索引.

Solr的索引分析

先看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 类型不同.

  • 单值的使用NUMERIC, 在luke中简称为number.
  • 多值的使用SORTED_NUMERIC, 在luke中简称为srtnum.(SORTED简称为srt, 看起来十分合理哈)

ES的索引分析

再来看一下ES生成的索引.

很明显, CITY和FACET_VALUES的底层Lucene字段类型完全相同.

而且都是DsrtnumT4/1, 和Solr中的FACET_VALUES完全一致.

所以可以得出结论, ES存储数值字段的时候, 默认都是多值的, 所以不需要指定.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • Solr的索引分析
  • ES的索引分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档