Наша команда просто обновляет lucene с 2.3 до 3.0, и мы запутались в setboost и getboost документа. То, что мы хотим, это просто установить повышение для каждого документа при добавлении их в индекс, а затем при поиске в нем документы в ответе должны иметь другой порядок в соответствии с заданным усилением. Но, похоже, порядок вообще не меняется, даже прирост каждого документа в поисковом ответе по-прежнему равен 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);
}
Спасибо за ваш ответ. Я обновил код в соответствии с вашим предложением, но, похоже, он все еще не работает. Кажется, что порядок результата не был изменен бустом, и результат каждого поискового запроса одинаков (1,0). Пожалуйста, проверьте мой код ниже:
public void testScore () выбрасывает исключение {
String [] a = new String [] {"schindler", "spielberg", "shawshank", "solace", "sorcerer", "stone", "soap",
"продавец", "сохранить"};
Список строк = 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();
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));
}
}
И вывод:
17 июня 2010 г. 16:12:18
ИНФОРМАЦИЯ:
оценка Шиндлера: 1,0
1.0 = (MATCH) ConstantScoreQuery (querytexts: s *), продукт:
1,0 = повышение
1.0 = queryNorm
оценка Спилберга: 1,0
1.0 = (MATCH) ConstantScoreQuery (querytexts: s *), продукт:
1,0 = повышение
1.0 = queryNorm
оценка шоушенка: 1,0
1.0 = (MATCH) ConstantScoreQuery (querytexts: s *), продукт:
1,0 = повышение
1.0 = queryNorm
оценка утешения: 1,0
1.0 = (MATCH) ConstantScoreQuery (querytexts: s *), продукт:
1,0 = повышение
1.0 = queryNorm
оценка колдуна: 1,0
1.0 = (MATCH) ConstantScoreQuery (querytexts: s *), продукт:
1,0 = повышение
1.0 = queryNorm
оценка камня: 1,0
1.0 = (MATCH) ConstantScoreQuery (querytexts: s *), продукт:
1,0 = повышение
1.0 = queryNorm
оценка мыла: 1,0
1.0 = (MATCH) ConstantScoreQuery (querytexts: s *), продукт:
1,0 = повышение
1.0 = queryNorm
оценка продавца: 1,0
1.0 = (MATCH) ConstantScoreQuery (querytexts: s *), продукт:
1,0 = повышение
1.0 = queryNorm
сохранить счет: 1,0
1.0 = (MATCH) ConstantScoreQuery (querytexts: s *), продукт:
1,0 = повышение
1.0 = queryNorm