我正在将DocValue添加到文档中
doc.add(new BinaryDocValuesField("foo",new BytesRef("bar")));
要检索ID为的特定文档的值docId
,我致电
DocValues.getBinary(reader,"foo").get(docId).utf8ToString();
get
直到Lucene 6.6才支持BinaryDocValues中的函数,但是对于Lucene 7.0或更高版本,似乎不再可用。
因此,如何在Lucene 7+中按文档ID获取DocValue(而不必遍历BinaryDocValues
/ DocIdSetIterator
,而不必每次都重新获取BinaryDocValues
和使用advanceExact
)?
Doc值是Lucene的列跨步字段值存储。出于面值和排序目的,Doc值在查询时用于随机访问的速度非常快。以下问题LUCENE-7407将访问模式从随机访问切换到迭代器。因为与任意随机访问API相比,迭代器API的限制性更强,所以此更改为Lucene使用主动压缩和其他优化提供了更大的自由度和功能:
您可以在以下博客中了解此更改:
实际上,此更改在某些情况下会导致性能下降,例如SOLR-9599。在主要情况下(构面和排序),可以正确使用迭代API,甚至可以执行一些优化。实际上,在很多情况下,此API并不是一个好的解决方案。所有这些情况都被当作不正确的用法丢弃(与sun.misc.Unsafe在java单词中遇到的相同问题)。
实际上,org.apache.lucene.index.DocValuesIterator#advanceExact
在某些实现的情况下,它相当快并且具有相似的性能和复杂性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句