Lucene 在单个字段上禁用长度规格化?

Lucene 在单个字段上禁用长度规格化?,lucene,Lucene,我有一个具有以下要求的字段: 它必须在索引时提升,因此“忽略规范”必须保持“错误” 但是,它不能受到字段长度标准化的影响(即,仅仅因为一个术语是在1:10个单词中找到的,而不是1:1000的单词中找到的,这不应该影响评分——两者的权重应该相等) 至少在另一个字段上,我确实希望字段长度标准化,因此我不怀疑在搜索器上广泛应用自定义相似性是合适的 如何在索引时增强单个字段,但禁用字段长度规范化的效果?您可以使用不同的相似性实现来实现每个字段: public类MySimilarity扩展PerField

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

  • 它必须在索引时提升,因此“忽略规范”必须保持“错误”
  • 但是,它不能受到字段长度标准化的影响(即,仅仅因为一个术语是在1:10个单词中找到的,而不是1:1000的单词中找到的,这不应该影响评分——两者的权重应该相等)
  • 至少在另一个字段上,我确实希望字段长度标准化,因此我不怀疑在搜索器上广泛应用自定义相似性是合适的

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

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

    public类MySimilarity扩展PerFieldSimilarityWrapper{
    相似性标准sim=新的分类相似性();
    相似性nolengthSim=无长度规范的新相似性();
    @凌驾
    公共相似性获取(字符串字段名){
    if(fieldName.equals(“someField”)){
    返回nolengthSim;
    }
    否则{
    返回标准SIM;
    }
    }
    //这两种方法必须在这里实现,因为它们
    //计算不特定于字段
    @凌驾
    公共浮点查询格式(用于规范化的浮点值){
    返回standardSim.queryNorm(valueForNormalization);
    }
    @凌驾
    公共浮点坐标(整数重叠,整数最大重叠){
    返回标准模拟坐标(重叠,最大重叠);
    }
    }
    
    其中
    无长度规范的相似性类似于:

    没有长度规范的公共类相似性扩展了类相似性{
    @凌驾
    公共浮动长度规范(FieldInvertState){
    返回1;
    }
    }
    
    非常感谢您的回复。DefaultSimilarity似乎在5.0中被弃用了。BM526将在6.0中成为默认值。是否有一个等价物覆盖BM52中的lengthNorm(…)?它似乎没有实现此功能。@loopforever-事实上,它最近在5.5版中被弃用。如果要切换到BM25,则需要实现EncodeNorm和DecodeNorm方法。请记住,这是一个完全不同的相关性评分算法。在我的测试案例中,两个文档似乎在评分方面都是相同的,除了一个字段(其中长度在两个字段之间变化)仍然产生不同的fieldNorm值:。也许我做错了什么?我只是在搜索时添加了searcher.setSimilarity(newcustomsimilarity())。我应该在索引时也做些什么吗?再次感谢你的帮助-是的。您需要在中设置相似性。定额是在索引时计算和存储的,因此在索引文档时需要设置相同的相似性。就是这样。非常感谢,这些都非常有用。希望其他人也会觉得这很有用。我向未来的读者建议的唯一变化是将“DefaultSimilarity”替换为“CustomSimilarity”,以避免在更新版本的Lucene中出现不推荐警告。