我正在将 DocValue 添加到文档中
doc.add(new BinaryDocValuesField("foo",new BytesRef("bar")));
检索具有 ID 的特定文档的值docId
, I call
DocValues.getBinary(reader,"foo").get(docId).utf8ToString();
The get
BinaryDocValues 中的函数最多支持卢塞恩6.6 https://lucene.apache.org/core/6_6_0/core/org/apache/lucene/index/BinaryDocValues.html, 但对于卢塞恩7.0 https://lucene.apache.org/core/7_0_0/core/org/apache/lucene/index/BinaryDocValues.html并且似乎不再可用。
So, 如何在 Lucene 7+ 中通过文档 ID 获取 DocValue(无需迭代BinaryDocValues
/ DocIdSetIterator
,并且无需重新获取BinaryDocValues
并使用advanceExact
每次) ?
Theory
Doc Values是Lucene的column-stride字段值存储。文档值的目的是在查询时快速随机访问以进行分面和排序。
以下问题LUCENE-7407 https://issues.apache.org/jira/browse/LUCENE-7407将访问模式从随机访问切换为迭代器。由于迭代器 API 是一种比任意随机访问 API 限制性更强的访问模式,因此这一更改为 Lucene 提供了更多的自由度和能力来使用积极的压缩和其他优化:
- 在稀疏数据的情况下减少磁盘空间使用
- 即使在非稀疏情况下,文档值的压缩率和解码速度也更好
- 删除缺失值的特殊列(getDocsWithField)并线程本地编解码器读取器
您可以在以下博客中了解此更改:
- 作为迭代器的文档值 http://blog.mikemccandless.com/2017/03/apache-lucene-70-is-coming-soon.html
- 使用 Apache Lucene 的稀疏与密集文档值 https://www.elastic.co/blog/sparse-versus-dense-document-values-with-apache-lucene
Practice
实际上,这种变化在某些情况下会导致性能下降,例如SOLR-9599 https://issues.apache.org/jira/browse/SOLR-9599。在主要情况下(分面和排序),迭代 API 在正确使用的情况下是可以的,甚至更重要的是,允许执行一些优化。
事实上,在很多情况下这个 API 并不是一个好的解决方案。所有这些情况都被视为不正确的用法而被丢弃(与我们在 java word 中使用 sun.misc.Unsafe 遇到的问题相同)。
实际上,org.apache.lucene.index.DocValuesIterator#advanceExact
速度相当快,并且在某些实现情况下具有相似的性能和复杂性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)