【问题标题】:Finding document/field length in Lucene 4在 Lucene 4 中查找文档/字段长度
【发布时间】:2013-04-15 13:50:29
【问题描述】:

我希望能够访问文档后索引的特定字段的长度(以术语表示)。最好,如果有一种无需重新索引的方法,我想这样做。但是,如果以某种方式重新索引可以轻松访问此值,那也可以。

http://blog.mikemccandless.com/2012/03/new-index-statistics-in-lucene-40.html

那个链接(向下滑动一点,找到 length 的提及)谈到在索引时访问值。我希望能够在索引后这样做。该链接还讨论了将值保存为 doc 值,但没有提供如何执行此操作的示例。

如果有人可以提供保存文档长度或在索引后访问它的示例,那将非常有帮助。谢谢。

【问题讨论】:

    标签: apache lucene


    【解决方案1】:

    文章中提到该统计数据是指FieldInvertState。一旦你有了它,如何获取你正在寻找的统计数据应该是相当简单的(只需致电getLengthgetUniquetermCount 或任何你需要的东西)。

    FieldInvertState 被传递到Similarity,特别是调用Similarity.computeNorm。范数值是在索引时计算和存储的,而不是在查询时计算的,因此要有效利用它就需要重新索引。

    使用它的典型方法是创建自定义Similarity,可能扩展DefaultSimilarity。简单地覆盖DefaultSimilaritylengthNorm 方法将是最简单的方法。它的标准实现是:

    return (float)(1.0 / Math.sqrt(numTerms));
    

    你可以用任何你喜欢的东西覆盖它。

    这将有助于根据自定义的基于长度的计算来调整得分。如果这不是您要查找的内容,而是需要能够获取该信息,我认为仅存储和字段,并从获取 Document 时返回的字段值中获取长度将是最简单的实施。

    【讨论】:

    • 我了解通过扩展 DefaultSimilarity 来覆盖 lengthNorm 的能力,使其返回长度,但 lengthNorm 方法将 FieldInvertState 作为参数。 Lucene 4 API 中的任何方法都不会返回 FieldInvertState 对象。我应该如何使用 lengthNorm?谢谢。
    • 您将自定义的 Similarity 类设置为索引和搜索时使用的 Similarity(分别为 IndexwriterConfig.setSimilarity 和 IndexSearcher.setSimilarity),Lucene 将调用它,将 FieldInvertState 传递给 computeNorm每当一个文档被索引时的方法。
    • 我不打算使用 IndexSearcher,我正在使用一些基本代码对 Lucene API 之外的文档进行排名。仅长度值似乎有点过分,但我会尝试并回复您。谢谢。
    • @user2282763 我不确定我是否理解您要完成的工作。如果您尝试在 Lucene API 之外对文档进行排名,为什么要使用 Lucene API 来做呢?为什么不直接使用字符串操作或类似的方法来获取长度?
    • 我只是使用 Lucene 来遍历索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2011-03-18
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多