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

2024-03-07

我正在将 DocValue 添加到文档中

doc.add(new BinaryDocValuesField("foo",new BytesRef("bar")));

检索具有 ID 的特定文档的值docId, I call

DocValues.getBinary(reader,"foo").get(docId).utf8ToString();

The getBinaryDocValues 中的函数最多支持卢塞恩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(使用前将#替换为@)

Lucene 7+中如何通过文档ID获取DocValue? 的相关文章

  • cursorMark是无状态的以及它如何解决深度分页

    作为指定here https cwiki apache org confluence display solr Pagination of Results光标标记是无状态的 但我不明白它是如何解决无状态的深度分页问题的 solr 是否按唯一
  • 如何将 Solarium 配置为使用 POST 而不是 GET 请求

    我面临的问题是我们发送到 solr jetty 的 uri 变得很长 超过 9k 字节 超出了 jetty 的默认限制 解决方案是从 GET 请求切换到 POST 请求 因为我们不想增加 jetty 可以接受的 requestHeaderS
  • 在 Solr 中实现术语关联挖掘的最简单方法是什么?

    关联挖矿似乎为检索提供了良好的结果相关术语在文本语料库中 有很多关于这个主题的著作 其中包括著名的LSA http en wikipedia org wiki Latent semantic analysis方法 挖掘关联最直接的方法是构建
  • Lucene 4.0 中的术语频率

    尝试使用 Lucene 4 0 计算词频 我的文档频率工作得很好 但不知道如何使用 API 来执行术语频率 这是我的代码 private static void addDoc IndexWriter writer String conten
  • 如何备份Solr数据库?

    我想知道如何备份 转储 Solr 数据库 如果只是复制一些文件 请指定哪些文件 文件名 位置等 Thanks We use Solr复制 http wiki apache org solr SolrReplication做我们的备份 您可以
  • Elasticsearch:带有停用词消除功能的带状疱疹

    我正在尝试实现一个 Elasticsearch 映射来优化大量文本中的短语搜索 根据中的建议本文 http www elasticsearch org blog searching with shingles 我使用 shingle 过滤器
  • Solr 突出显示是否还可以指示返回片段在原始字段内的位置或偏移量?

    背景 使用Solr 4 0 0 我已经对一组示例文档的文本建立了索引并启用了术语向量 以便我可以使用快速向量突出显示
  • SpatialQuery 使用 Lucene 进行基于位置的搜索

    我的 lucene 索引已索引纬度和经度字段 如下所示 doc Add new Field latitude latitude ToString Field Store YES Field Index UN TOKENIZED doc Ad
  • Solr 增量导入不起作用

    我使用的是solr 4 2 请注意 完全导入有效 但增量导入却无效 增量导入不会给出任何错误 但不会获取任何更改 这是数据配置文件
  • 如何统计lucene索引中每个文档的term数?

    我想知道 lucene 索引中每个文档的术语数量 我一直在 API 和互联网上搜索 但没有结果 你能帮助我吗 Lucene 的构建是为了回答相反的问题 即哪些文档包含给定术语 因此 为了获取文档的术语数量 您必须进行一些修改 第一种方法是存
  • 在 Solr 更新中指定多值术语频率?

    我有一个包含多值字段的 Solr 模式 我正在 Solr 外部解析文档并使用更新索引http wiki apache org solr UpdateJSON http wiki apache org solr UpdateJSON 也可以看
  • Data-config.xml 和 mysql - 我只能加载“id”列

    我在 Windows Server 2012 上安装了 Solr 5 0 0 我想将表中的所有数据加载到 solr 引擎中 我的 data config xml 如下所示
  • 如何减少solr内存使用?

    我在我的应用程序中使用 solr 只有数百个文档 内存占用80M左右 如何减少 80M 并不多 事实上它几乎是最低限度 你不会比这个低很多 影响内存使用的一些因素 输入文档尺寸 多线程文档更新 缓存大小 分面查询 Sorting 参考 ht
  • 在休眠搜索中使用现有分析器AnalyzerDiscriminator

    Entity Indexed AnalyzerDefs AnalyzerDef name en tokenizer TokenizerDef factory StandardTokenizerFactory class filters To
  • Solr 日期字段 tdate 与 date?

    所以我有一个关于 Solr 字段日期类型的问题 这个问题非常简单 日期 字段和 tdate 字段之间有什么区别 模式 xml 声称 为了更快的范围查询 请考虑 tdate 类型 和 基于 Trie 的日期字段 以实现更快的日期范围查询和日期
  • 特定查询出现错误

    Lucene 的新手 我在 java 客户端中将它与 Hibernate 一起使用 并且在特定查询上收到此错误 HSEARCH000146 The query string a applied on field name has no me
  • solr 不标记受保护的单词

    我在 Solr Lucene 3 x 中有一个文档 其中有一个特殊的复制字段facet headline 以便有一个用于分面的未词干字段 有时两个或以上的单词属于在一起 这应该被处理 算作一个单词 例如 kim jong il 因此标题 星
  • 如何增强solr中的字段

    我已经事先确定了提升 我在 solr 索引中有一个名为boost1 该提升字段的值介于 1 到 10 之间 类似于 google PR 排名 这是应该应用于 solr 中运行的每个查询的提升 这是我的索引中的字段 Id Title Text
  • CakePHP 与 Lucene

    我正在尝试使用 cakephp 实现 Lucene 并遵循本指南http jamienay com 2010 01 zend search lucene datasource for cakephp http jamienay com 20
  • 如何过滤 Solr 中多值字段返回的值

    我有一个文档 其中包含一个名为 uuid 的字段 该字段是一个列表 多值 每个文档最多可以有 100k 个值 例如 我想搜索与以 5ff6115e 开头的 uuid 匹配的文档 我已经可以通过使用成功做到这一点q uuids 5ff6115

随机推荐