【问题标题】:lucene 4.0 statistics [duplicate]lucene 4.0统计[重复]
【发布时间】:2012-03-12 22:01:33
【问题描述】:

虽然这是我第二次发布相同的问题,the first one is here,但没有答案或部分答案。我一直在努力解决这个问题,并且迷失在 lucene api 中......

我感兴趣的是,从 Lucene 获取文档长度。当我使用searcher.explain(使用bm25)时,我看到这个特性存在,但我只需要获取它。

我非常感谢一个例子,因为我是 Lucene 的新手,只是指向 API 没有帮助。

一种天真的方法是将这个长度存储在一个单独的字段中,通过使用 java 中的string.length(),并在查询时检索它,但是,这个 fature 已经存在(否则 bm25 将不起作用)因此我不想冗余存储。

如果您能更详细地解释如何使用 lucene 4.0 实现这一点,我将不胜感激,如果您无法提供和回答,请不要仅仅为了回复而回复(如那么其他人不会阅读我的帖子认为它已解决!!!),也不要向我发送指向 api 的指针(例如,参见 Robert Muir 的 Similarity.computeNorm),因为这对我没有帮助。我需要更多细节,比如如何使用这个 FieldInvertState 或 Similarity.computeNorm ???关于查询时间或索引时间???一小段代码会有所帮助,您必须考虑到我不是这里的专家,否则我不会问

提前致谢

【问题讨论】:

  • 请不要因为您不喜欢阅读文档而重复问题。我向您指出了有关如何使用这些统计信息的相关文档,以便您可以继续使用您的应用程序。事实:lucene 不存储文档长度(或任何其他每个文档的统计信息),除非您自己在相似度中这样做。我知道这一点是因为我为 Lucene 4.0 编写了有问题的 API。
  • 你没有给出细节,现在我知道我应该在索引时做(初始化。我在查询时想),但是在 API 中没有关于如何做的例子,在索引中我只能存储文档,而不是相似度对象。你能发布一段代码如何在索引中插入这个指标吗?
  • 我给了你一个 Similarity.computeNorm 的链接,在 Lucene 中有许多使用文档长度的评分系统(你可以查看他们的代码)。您的问题没有提供足够的信息:文档长度是多少(是原始术语的数量还是添加了同义词之类的分析术语的数量)?您需要什么级别的精度;规范已完全加载到内存中,那么您愿意在 RAM 中花费多少字节/文档来进行此统计?您是否还需要支持索引时间提升?这些都是影响性能和相关性的重要决策。
  • 在我的例子中,文档长度只是一些分析的术语。这样做的原因是我想抑制非常大的文档与非常短的文档的影响,因此我想找到一个文档的长度来做到这一点。所以基本上,当我打印 top-k 文档时,我希望能够使用这个因素(文档长度)。但是,这个相似对象是抽象的,我不知道如何利用它。我想简单地为每个文档创建一个新字段,然后插入 contents.toString().length,因为我无法理解这个 Similarity.ComputeNorm 是如何工作的...... :(

标签: java lucene


【解决方案1】:

是的,你看到的 Lucene 版本越新,它的复杂性就越大。有时阅读早期版本的文档有助于更清楚地了解基本原理。

现在到您的情况...相似性是您分配给整个索引过程的一种策略对象 (IndexWriterConfig.setSimilarity)。将调用它的方法来计算有关每个文档及其每个字段的各种信息,并将其添加到索引中。所以罗伯特在这里建议的是让你的相似性子类(接受文档的建议,不要直接子类相似性,而是现有的实现之一,比如 DefaultSimilarity)。覆盖 computeNorm 方法以生成传入字段所需的数字。默认情况下,Lucene 已经计算了该规范,以便它可以淡化长字段,所以我猜你有比这更具体的东西。

如果您想认真使用 Lucene,我强烈建议您获取 Lucene In Action。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多