2

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

1 回答 1

0

您是否尝试过增加提升该领域的数量?请记住,用于编码该值的方法非常有损的,以节省索引中的空间。您只能指望大约 1 位有效数字的精度。

尝试一个更大的值,然后将其拉回,直到按照您想要的方式调整它。

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

你跑过explain(),看看是什么影响了你的查询吗?仅仅因为您提升了标题,并不意味着标题上的匹配将是第一个返回的结果。

于 2013-05-06T15:47:24.947 回答