如何在Lucene 7+中通过文档ID获取DocValue?

xpages-noob

我正在将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)?

伊万·马蒙托夫(Ivan Mamontov)

理论

Doc值是Lucene的列跨步字段值存储。出于面值和排序目的,Doc值在查询时用于随机访问的速度非常快。以下问题LUCENE-7407将访问模式从随机访问切换到迭代器。因为与任意随机访问API相比,迭代器API的限制性更强,所以此更改为Lucene使用主动压缩和其他优化提供了更大的自由度和功能:

  • 在数据稀疏的情况下减少磁盘空间使用
  • 即使在非稀疏情况下,也具有更好的压缩率和doc值的解码速度
  • 删除缺少值的特殊列(getDocsWithField)并线程本地编解码器读取器

您可以在以下博客中了解此更改:

实践

实际上,此更改在某些情况下会导致性能下降,例如SOLR-9599在主要情况下(构面和排序),可以正确使用迭代API,甚至可以执行一些优化。实际上,在很多情况下,此API并不是一个好的解决方案。所有这些情况都被当作不正确的用法丢弃(与sun.misc.Unsafe在java单词中遇到的相同问题)。

实际上,org.apache.lucene.index.DocValuesIterator#advanceExact在某些实现的情况下它相当快并且具有相似的性能和复杂性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Lucene 4中获取Lucene字段的所有条款

如何在Lucene 3.5.0中提取文档术语向量

如何在lucene中索引日期字段

如何在FirestorePagingAdapter中获取文档ID?

如何在Lucene 7中增强查询?

Google Firestore-如何在一次往返中通过多个ID获取文档?

Umbraco 7 + Razor:如何通过ID获取文档/节点?

如何在Lucene中存储多种不同类型的文档

如何在solrcloud中通过shard wise获取文档数量?

如何在Lucene 6.0中避免重复的文档索引

如何在Lucene 6中获取文档的领域规范?

如何在Lucene PlainTextDictionary中附加单词

Lucene-如何在给定父文档ID的情况下获取父模块中的所有子文档

Firestore-如何在React Native中通过ID获取文档

通过http调用获取配置后如何在angular 7中动态初始化Firebase

iText 7如何在整个文档中设置字体

如何在elasticsearch或lucene中基于索引类型增强搜索?

如何在Windows中打开Lucene文件?

如何在iOS 7(越狱)中通过上下文ID或Mach端口获取应用程序的捆绑标识符?

Lucene-使用docValue获取docId或文档

如何在Lucene中访问存储的提交数据

如何在Lucene中创建以空格分隔的名称的模糊搜索?

如何在Lucene中替换Solr中的“ schema.xml”?

如何在Apache Lucene中删除或更新文档

如何获取Lucene设置的内部文档ID

如何在 Lucene 7.4 中索引短字段

angular 7中的firestore如何获取文档ID

如何在solr中获取lucene索引的版本

Lucene 如何在 StandardAnalyzer 中关闭“toLowerCase”?