Наша команда только что обновила 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() выдает Exception { String[] a = new String[] { "Шиндлер", "Спилберг", "Шоушенк", "утешение", "колдун", "камень", "мыло", "продавец", "спасти" }; Строки списка = Arrays.asList(a); Индекс AutoCompleteIndex = новый индекс(); Модуль записи IndexWriter = новый 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