据我了解,在elasticsearch中存储字段有两个目的:
- 可以直接从磁盘检索该字段,无需解析
_source
。例如,当使用字段查询时就会发生这种情况。 - 如果禁用
_source
,则存储的字段将构成返回的文档。
但是,存储字段需要额外的磁盘空间,并且有理由更愿意在 Elasticsearch 中保持 _source
启用,因此可能仅对于较大的文档才值得。
同样,文档值存储您可以通过文档查找的字段。看起来这些字段是按字段而不是按文档在磁盘上聚集的,这使得从不同文档中检索大量相同字段(排序、聚合等)更加有效。这样做不是为了这些操作而在内存中缓存所有存储的字段。
我的问题是...如果您有文档值,是否仍然存在用于存储字段的有效用例,如果是,它是什么?
最终,我试图确定 doc_values 似乎合适的字段的正确映射。
最佳答案
如果字段未存储但启用了 docValues,我不知道 elasticsearch 是否会为您检索字段值。我能告诉你的是,虽然 docValues 通常表示以列方式存储的字段(正如你所指出的,这使得排序甚至函数查询所需的批量检索变得更容易),但 lucene 将 docValues 本身视为单独的字段。
因此,在elasticsearch中,当您在字段foo
上启用docvalues并最终得到相同的数据重复时,lucene将为每个文档创建一个docValues
字段并复制数据从 foo 字段到它。因此,实际上在 lucene 级别并不能保证数据是重复的,但在 elasticsearch 级别却可以保证。
长话短说,您询问的此功能可以实现(如果尚未实现)
关于java - 如果 doc 值用于 Elasticsearch 中的某个字段,那么存储该字段是否多余?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24440847/