java - 如果 doc 值用于 Elasticsearch 中的某个字段,那么存储该字段是否多余?

标签 java lucene elasticsearch

据我了解,在elasticsearch中存储字段有两个目的:

  1. 可以直接从磁盘检索该字段,无需解析_source。例如,当使用字段查询时就会发生这种情况。
  2. 如果禁用 _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/

相关文章:

java - 无法从 lucene 索引读取字段内容

jakarta-ee - 如何存储,版本化和部署 Elasticsearch 河插件设置?

elasticsearch - Python spark Dataframe 到 Elasticsearch

elasticsearch - 如何在运行官方 Elasticsearch docker 镜像时设置默认 'elastic' 用户密码?

java - 具有 O(m (log n + log m)) 时间复杂度的算法,用于在每行排序的 n*m 矩阵中查找第 k 个最小元素?

Java - 如果 setEditable(false) 则无法向下滚动 JTextArea

java - Google 开发人员控制台云存储桶或文件删除按钮永久禁用

java - 计算lucene搜索的时间

java - AtomicInteger 中的 "Compare And Set"如何工作

lucene - 哪些是 Lucene 的最佳替代品?