使用Lucene设置字段的提升

时间:2013-05-04 13:44:04

标签: lucene

我正在使用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;
}
}

1 个答案:

答案 0 :(得分:0)

你是否尝试过增加你增加的数量?请注意,the method used of encoding that value 极其有损,以节省索引中的空间。你只能指望大约1位精确数字。

尝试更大的值,然后将其拉回,直到您按照自己想要的方式进行调整。

那就是说,你应该看到两者之间的一些细微差别。根据我的测试,当lengthNorm被存根时,1.7将获得最终值为1.5的相似性。

您是否运行explain(),以查看影响查询的内容?仅仅因为你提升了标题,并不意味着标题上的匹配将是第一个返回的结果。