如何在 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();
}
}
}
我正在使用 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();
}
}
}