【发布时间】:2016-03-09 16:48:55
【问题描述】:
我有一个具有以下要求的字段:
- 它必须在索引时被提升,因此“omitNorms”必须保持“假”
- 但是,它不得进行字段长度规范化(即,仅仅因为在 1:10 的单词中找到一个术语,而 1:1000 不应该影响评分 - 两者的权重应该相同)
在至少一个其他字段上,我确实想要字段长度标准化,因此我不怀疑在搜索器上广泛应用自定义相似度是合适的。
如何在索引时提升单个字段,但禁用字段长度规范化的效果?
【问题讨论】:
标签: lucene
我有一个具有以下要求的字段:
在至少一个其他字段上,我确实想要字段长度标准化,因此我不怀疑在搜索器上广泛应用自定义相似度是合适的。
如何在索引时提升单个字段,但禁用字段长度规范化的效果?
【问题讨论】:
标签: lucene
您可以使用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;
}
}
【讨论】: