【问题标题】:Disable length normalization on a single field?在单个字段上禁用长度规范化?
【发布时间】:2016-03-09 16:48:55
【问题描述】:

我有一个具有以下要求的字段:

  1. 它必须在索引时被提升,因此“omitNorms”必须保持“假”
  2. 但是,它不得进行字段长度规范化(即,仅仅因为在 1:10 的单词中找到一个术语,而 1:1000 不应该影响评分 - 两者的权重应该相同)

在至少一个其他字段上,我确实想要字段长度标准化,因此我不怀疑在搜索器上广泛应用自定义相似度是合适的。

如何在索引时提升单个字段,但禁用字段长度规范化的效果?

【问题讨论】:

    标签: lucene


    【解决方案1】:

    您可以使用PerFieldSimilarityWrapper 为每个字段使用不同的相似性实现:

    public class MySimilarity extends PerFieldSimilarityWrapper {
        Similarity standardSim = new ClassicSimilarity();
        Similarity nolengthSim = new SimilarityWithoutLengthNorm();
    
        @Override
        public Similarity get(String fieldName) {
            if (fieldName.equals("someField")) {
                return nolengthSim;
            }
            else {
                return standardSim;
            }
        }
    
        //These two methods must be implemented here, as their
        //calculation is not field specific
        @Override
        public float queryNorm (float valueForNormalization) {
            return standardSim.queryNorm(valueForNormalization);
        }
    
        @Override
        public float coord (int overlap, int maxOverlap) {
            return standardSim.coord(overlap, maxOverlap);
        }
    }
    

    SimilarityWithoutLengthNorm 看起来像这样:

    public class SimilarityWithoutLengthNorm extends ClassicSimilarity{
        @Override
        public float lengthNorm(FieldInvertState state) {
            return 1;
        }
    }
    

    【讨论】:

    • 非常感谢您的回复。似乎 DefaultSimilarity 在 5.0 中已被弃用。 BM52Similarity 在 6.0 中成为默认值。在 BM52Similarity 中是否有等效于覆盖 lengthNorm(...) 的方法?好像没有实现这个功能。
    • @loopforever - 事实上,它最近在 5.5 版中已被弃用。如果要切换到 BM25,则需要实现 EncodeNorm 和 DecodeNorm 方法。请记住,这是一种完全不同的相关性评分算法。
    • 看来,在我的测试用例中,除了一个字段(两者的长度不同)之外,两个文档在所有方面都相等,但仍然产生不同的 fieldNorm 值:gist.github.com/anonymous/7e9c5194e671a0c7886a。也许我做错了什么?我只是在搜索时添加了 searcher.setSimilarity(new CustomSimilarity()) 。我是否也应该在索引时间做某事?再次感谢您的帮助。
    • @loopforever - 是的。您需要在IndexWriterConfig 中设置相似度。规范是在索引时计算和存储的,因此在索引文档时需要设置相同的相似度。
    • 就是这样。非常感谢——这一切都非常有帮助。希望其他人也会发现这很有用。我建议未来读者的唯一更改是将“DefaultSimilarity”替换为“CustomSimilarity”,以避免在较新版本的 Lucene 中出现弃用警告。
    猜你喜欢
    • 2012-04-07
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多