Lucene setboost не работает - PullRequest
       2

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

1 голос
/ 11 июня 2010

Наша команда просто обновляет 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

1 Ответ

0 голосов
/ 14 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...