我正在使用Lucene实现单词搜索。 我想为每个文档添加两个字段:一个标题字段,其中包含文档中的前100个字符,以及一个内容字段,其中包含文档中的其余字符。
ContentHandler handler = new BodyContentHandler();
try {
parser.parse(is, handler, metadata);
} finally {
is.close();
}
Document doc = new Document();
Field titleField = new Field("title",
handler.toString().substring(0, 100),
Field.Store.YES,
Field.Index.ANALYZED_NO_NORMS);
Field contentsField = new Field("contents",
handler.toString().substring(101),
Field.Store.YES,
Field.Index.ANALYZED_NO_NORMS);
我想为每个字段添加提升功能:我希望标题占70%,内容占30%。
我这样做:
titleField.setBoost(1.70f);
doc.add(titleField);
doc.add(contentsField);
doc.add(new Field("filename", metadata.get(Metadata.RESOURCE_NAME_KEY),
Field.Store.YES, Field.Index.ANALYZED));
但是,我无法看到文件的不同之处。
在计算分数时,字段的长度是否重要?
我还尝试实现一个扩展DefaultSimilarity的类,但它没有帮助。
class IsolationSimilarity extends DefaultSimilarity {
public IsolationSimilarity(){
}
@Override
public float idf(int docFreq, int numDocs) {
return(float)1.0;
}
@Override
public float coord(int overlap, int maxOverlap) {
return 1.0f;
}
@Override
public float lengthNorm(String fieldName, int numTokens){
return 1.0f;
}
}
答案 0 :(得分:0)
你是否尝试过增加你增加的数量?请注意,the method used of encoding that value 极其有损,以节省索引中的空间。你只能指望大约1位精确数字。
尝试更大的值,然后将其拉回,直到您按照自己想要的方式进行调整。
那就是说,你应该看到两者之间的一些细微差别。根据我的测试,当lengthNorm被存根时,1.7将获得最终值为1.5的相似性。
您是否运行explain()
,以查看影响查询的内容?仅仅因为你提升了标题,并不意味着标题上的匹配将是第一个返回的结果。