我有大约1000万个非常平坦(如RDBMS行)文档存储在ES中 . 每个文档有10个字段,其中5个字段实际上是枚举 .
我创建了一个映射,将Enum的序数映射到Short,并在索引文档时传递序数 .
Elasticsearch是否真的将这些值存储为索引中的Short?或者他们得到.toString()'ed?当我将字段映射到数据类型时,“引擎盖下”实际发生了什么?
由于ES是 Build 在Lucene之上的,因此可以查看字段实际存储和使用“引擎盖”的地方 .
据我所知,Lucene实际上存储的数据不仅仅是String格式 . 所以回答你的一个问题,我相信答案是否定的 - 一切都没有得到.toString()'ed . 事实上,如果您查看Lucene's document package的文档,您会发现它有许多数字类型(例如 IntField , LongField 等) .
IntField
LongField
Elasticsearch documentation on Core Types也提到了这个事实:
“它使用Lucene中的特定构造来支持数值 . 数字类型与相应的Java类型具有相同的范围 . ”
此外,Lucene提供专门用于搜索具有已知数字术语的字段的查询(ES利用),例如Lucene's search package中讨论的_1846774 . Lucene中相同的数字类型也允许 efficient sorting .
另一个好处是数据完整性 . 就像任何数据库一样,如果您只希望字段包含数字数据,并且您的应用程序尝试插入非数字数据,则在大多数情况下您希望该插入失败 . 当您尝试索引其字段值与类型映射不匹配的文档时,这是ES的默认行为 . (但是,如果您愿意,可以使用 ignore_malformed 在数字字段上禁用此行为)
ignore_malformed
希望这可以帮助...
1 回答
由于ES是 Build 在Lucene之上的,因此可以查看字段实际存储和使用“引擎盖”的地方 .
据我所知,Lucene实际上存储的数据不仅仅是String格式 . 所以回答你的一个问题,我相信答案是否定的 - 一切都没有得到.toString()'ed . 事实上,如果您查看Lucene's document package的文档,您会发现它有许多数字类型(例如
IntField
,LongField
等) .Elasticsearch documentation on Core Types也提到了这个事实:
此外,Lucene提供专门用于搜索具有已知数字术语的字段的查询(ES利用),例如Lucene's search package中讨论的_1846774 . Lucene中相同的数字类型也允许 efficient sorting .
另一个好处是数据完整性 . 就像任何数据库一样,如果您只希望字段包含数字数据,并且您的应用程序尝试插入非数字数据,则在大多数情况下您希望该插入失败 . 当您尝试索引其字段值与类型映射不匹配的文档时,这是ES的默认行为 . (但是,如果您愿意,可以使用
ignore_malformed
在数字字段上禁用此行为)希望这可以帮助...