如何在 Lucene 中覆盖单个字段中的相似性?

How to override Similarity in a single field in Lucene?

我正在使用 Apache Lucene 4.4 版。

我的系统将 collection 文档索引到三个不同的字段:标题描述作者 文档。

我希望文档在查询词出现频率越高时得分越高。但是,当术语是作者字段的一部分时,我只希望它充当 "boolean";也就是说,如果该术语只出现一次或多次,则添加相同的分数。例如,如果一篇文档的三位作者姓氏 "Smith",则只应给出一个匹配项。

为此,我找到了以下代码,它覆盖了术语频率:

Similarity sim = new DefaultSimilarity() {
    @Override
    public float tf(float freq) {
        return freq == 0 ? 0 : 1;
    }
};
searcher.setSimilarity(sim);

但是,这三个字段覆盖了我。我如何设法覆盖单个作者字段?

您可以像这样实现 PerFieldSimilarityWrapper

public class MyCustomSimilarity extends PerFieldSimilarityWrapper {
    @Override
    public Similarity get(String fieldName) {
        if (fieldName.equals("author")) {
            return new CustomAuthorSimilarity();
        }
        else {
            return new DefaultSimilarity();
        }
    }
}