【发布时间】: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 = 查询标准
【问题讨论】: