Твик Lucene забил - PullRequest
       37

Твик Lucene забил

0 голосов
/ 02 декабря 2018

Я посмотрел другие вопросы о подсчете очков Lucene, но, похоже, ни один из них не покрывает мою проблему.

Я индексирую несколько больших файлов Word.Строки в этих файлах разделены, и каждые 10 строк в файле превращаются в Lucene Document (на самом деле они перекрывают 10 строк Documents, но это не имеет значения).

Когда ясделайте поиск по «пузырному цвету», например ... что я нахожу, к моему небольшому удивлению, что если одно из этих слов встречается дважды в заданном Document, оно считается почти так же хорошо, как и поиск обоихслова для поиска (например, «пузырь» и «цветение») в одном и том же Document.

Также Document (набор из 10 строк), содержащий 3 экземпляра слова «пузырь», будет указан перед Document, содержащим 1 x «пузырь» и 1 x «цветение».И тот, у кого 2 x «пузыря», кажется, считается равным Document с обоими словами.

NB a String, как это, «цветение пузыря», похоже, будет превращено вBooleanQuery с двумя предложениями на QueryParser.parse().

Есть ли способ настроить что-либо, чтобы факт нахождения обоих слов (поисковых терминов) в Document оценил это на Document выше, чем нахождение2 или 3 экземпляра одного слова, но ноль другого?

PS Кстати, я просто выполнил поиск, где строка поиска была "+ bubble + bloom" ... очевидно, это исключает любые Document где отсутствует одно словоНо я вижу это как своего рода обходной путь.Я хочу, чтобы функциональность по умолчанию без «+» (для «требуется») оценивала факт присутствия всех терминов выше.

1 Ответ

0 голосов
/ 18 декабря 2018

Что ясно, что оценка TF-IDF или BM25 очень зависит от распределения терминов в индексе, поскольку, например, я смог получить документ, содержащий «пузырьковое цветение», выше, чем любой из документов, однако этоскорее всего, для моего тестового дистрибутива только

Существуют различные способы добиться этого стандартным способом.Один из самых простых способов - использовать ConstantScoreQuery , который всегда будет давать вам 1,0 (или любое другое произвольное число) для одного или нескольких совпадений термина.В сочетании с BooleanQuery , который делает сумму, вы можете легко получить документы, оцененные в соответствии с количеством терминов в документе.

Например,

Query query = new BooleanQuery.Builder()
            .add(new ConstantScoreQuery(new TermQuery(new Term("text", "bloom"))), BooleanClause.Occur.SHOULD)
            .add(new ConstantScoreQuery(new TermQuery(new Term("text", "bubble"))), BooleanClause.Occur.SHOULD)
            .build();

Это все еще ИЛИзапрос, так что у вас есть совпадения с любым из них.Очевидная проблема с этим в том, что совпадение bubble или bloom равно.Это, вероятно, также имеет некоторые оговорки.

Ссылка на полный код: там

...