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

时间:2016-11-05 11:55:45

标签: java indexing lucene word-frequency

我正在使用Apache Lucene的版本4.4

我的系统将一组文档编入三个不同的字段:文档的标题描述作者。< / p>

我希望文档能够获得更高的分数,它具有更高的查询字词频率。但是,当该术语是作者字段的一部分时,我只是希望它充当&#34; boolean&#34 ;;也就是说,如果该术语仅出现一次或多次,则添加相同的分数。例如,如果一个文档的三个作者姓氏为#34;史密斯&#34;,则只应给出一个匹配。

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

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

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

1 个答案:

答案 0 :(得分:3)

您可以实施PerFieldSimilarityWrapper,如下所示:

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