Lucene setboost не работает

Наша команда только что обновила 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


person Keven    schedule 11.06.2010    source источник


Ответы (1)


Повышение уровня документов должно вступать в силу при поиске, а не при последовательном просмотре документов в индексе, как в примере кода. Попробуйте провести следующий эксперимент:

  1. Проиндексируйте всего два документа: первый с id 1, текст "schindler" и boost 3.0; второй с идентификатором 2, текстом «schindler» и boost 1.0.
  2. Откройте IndexSearcher.
  3. Найдите «schindler» и посмотрите порядок документов в соответствии с их идентификаторами. Первый идентификатор должен быть равен 1 из-за более высокого повышения.

Значение увеличения документа: когда все остальные факторы оценки равны, документ с более высоким значением повышения получает более высокий балл. См. документацию Lucene по оценке и explain () функция.

person Yuval F    schedule 14.06.2010