【问题标题】:Lucene setboost doesn't workLucene setboost 不起作用
【发布时间】:2011-03-02 11:47:54
【问题描述】:

我们的团队刚刚将 lucene 从 2.3 升级到 3.0,我们对文档的 setboost 和 getboost 感到困惑。我们想要的只是在将每个文档添加到索引时为每个文档设置一个提升,然后在搜索它时,响应中的文档应该根据我设置的提升具有不同的顺序。但似乎顺序并没有改变,甚至搜索响应中每个文档的 boost 仍然是 1.0。有人可以给我一些打击吗?以下是我们的代码:

    String[] a = new String[] { "schindler", "spielberg", "shawshank", "solace", "sorcerer", "stone", "soap",
                "salesman", "save" };
    List<String> strings = Arrays.asList(a);
    AutoCompleteIndex index = new Index();
    IndexWriter writer = new IndexWriter(index.getDirectory(), AnalyzerFactory.createAnalyzer("en_US"), true,
                MaxFieldLength.LIMITED);
    float i = 1f;
    for (String string : strings) {
        Document doc = new Document();
        Field f = new Field(AutoCompleteIndexFactory.QUERYTEXTFIELD, string, Field.Store.YES,
                Field.Index.NOT_ANALYZED);
        doc.setBoost(i);
        doc.add(f);
        writer.addDocument(doc);
        i += 2f;
    }

    writer.close();
    IndexReader reader2 = IndexReader.open(index.getDirectory());
    for (int j = 0; j < reader2.maxDoc(); j++) {
        if (reader2.isDeleted(j)) {
            continue;
        }

        Document doc = reader2.document(j);
        Field f = doc.getField(AutoCompleteIndexFactory.QUERYTEXTFIELD);
        System.out.println(f.stringValue() + ":" + f.getBoost() + ", docBoost:" + doc.getBoost());
        doc.setBoost(j);

    }

感谢您的回答。我已根据您的建议更新了代码,但似乎仍然无法正常工作。似乎结果的顺序没有被 boost 改变,并且每个搜索结果的分数都是相同的(1.0)。请检查下面的代码:

public void testScore() 抛出异常 { String[] a = new String[] { "schindler", "spielberg", "shawshank", "solace", "sorcerer", "stone", "soap", "推销员", "保存" }; 列表字符串 = Arrays.asList(a); AutoCompleteIndex 索引 = 新索引(); IndexWriter writer = new IndexWriter(index.getDirectory(), AnalyzerFactory.createAnalyzer("en_US"), true, MaxFieldLength.LIMITED);

    float i = 1f;
    for (String string : strings) {
        Document doc = new Document();
        doc.add(new Field(AutoCompleteIndexFactory.QUERYTEXTFIELD, string, Field.Store.YES,
                Field.Index.NOT_ANALYZED));
        doc.setBoost(i);
        //            System.out.println(doc.getBoost());
        i += 2f;
        writer.addDocument(doc);
    }

    writer.close();


    BooleanQuery
            .setMaxClauseCount(BooleanQuery.getMaxClauseCount() < getMaxQueryTextEntry() ? getMaxQueryTextEntry()
                    : BooleanQuery.getMaxClauseCount());
    Term searchTerm = new Term(AutoCompleteIndexFactory.QUERYTEXTFIELD, "s");
    PrefixQuery query = new PrefixQuery(searchTerm);
    IndexSearcher searcher = new IndexSearcher(index.getDirectory());

    TopDocs docs = searcher.search(query, 10);
    ScoreDoc[] hits = docs.scoreDocs;
    for (ScoreDoc hit2 : hits) {
        String hit = searcher.doc(hit2.doc).get(AutoCompleteIndexFactory.QUERYTEXTFIELD);
        System.out.println(hit + " score:" + hit2.score);
        System.out.println(searcher.explain(query, hit2.doc));

    }

}

输出是:

2010 年 6 月 17 日下午 4:12:18 信息:

迅达评分:1.0 1.0 = (MATCH) ConstantScoreQuery(querytexts:s*),乘积: 1.0 = 提升 1.0 = 查询标准

斯皮尔伯格得分:1.0 1.0 = (MATCH) ConstantScoreQuery(querytexts:s*),乘积: 1.0 = 提升 1.0 = 查询标准

肖申克得分:1.0 1.0 = (MATCH) ConstantScoreQuery(querytexts:s*),乘积: 1.0 = 提升 1.0 = 查询标准

安慰分数:1.0 1.0 = (MATCH) ConstantScoreQuery(querytexts:s*),乘积: 1.0 = 提升 1.0 = 查询标准

巫师分数:1.0 1.0 = (MATCH) ConstantScoreQuery(querytexts:s*),乘积: 1.0 = 提升 1.0 = 查询标准

石头分数:1.0 1.0 = (MATCH) ConstantScoreQuery(querytexts:s*),乘积: 1.0 = 提升 1.0 = 查询标准

肥皂分数:1.0 1.0 = (MATCH) ConstantScoreQuery(querytexts:s*),乘积: 1.0 = 提升 1.0 = 查询标准

业务员评分:1.0 1.0 = (MATCH) ConstantScoreQuery(querytexts:s*),乘积: 1.0 = 提升 1.0 = 查询标准

保存分数:1.0 1.0 = (MATCH) ConstantScoreQuery(querytexts:s*),乘积: 1.0 = 提升 1.0 = 查询标准

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    文档提升是在您搜索时生效,而不是在您按顺序浏览索引中的文档时生效,就像在您的代码示例中一样。 尝试做以下实验:

    1. 仅索引两个文档:第一个 ID 为 1,文本为“schindler”,boost 3.0;第二个 id 为 2,文本为“schindler”,boost 1.0。
    2. 打开一个 IndexSearcher。
    3. 搜索“schindler”并根据文档的 ID 查看文档的顺序。第一个 id 应该是 1,因为 boost 更高。

    document boost 的含义是:当所有其他评分因素相等时,boost 越高的文档得分越高。请参阅 Lucene 的 scoring documentationexplain() function

    【讨论】:

      猜你喜欢
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      相关资源
      最近更新 更多