Перенос сборщика Lucene HitCollector (2.x) в коллекционер (3.x) - PullRequest
2 голосов
/ 26 марта 2012

В одном из наших проектов мы используем старую версию Lucene (2.3.2).Сейчас я смотрю на текущие версии Lucene (3.5.0) и пытаюсь переписать старый код.В старом проекте мы расширили TopFieldDocCollector, чтобы выполнить дополнительную фильтрацию в методе collect ().Однако у меня возникли проблемы с пониманием нового класса Collector, и я не смог найти хороший пример.

1) Метод setScorer ().Как / где я могу получить объект Scorer?

2) Метод collect ().Я думаю, мне нужно создать свою собственную коллекцию и сохранить интересующие меня docIds, правильно?

3) При расширении TopDocsCollector вместо этого мне нужно было бы реализовать PriorityQueue для использования в конструкторе, правильно?Кажется, для него нет стандартной реализации.Но мне все еще нужна моя собственная коллекция для хранения docIds (или, скорее, ScoreDocs) и вызова populateResults после завершения поиска?

В целом, кажется, что расширение Collector (намного) проще, чем расширение TopDocsCollector, номожет быть, я что-то упустил.

1 Ответ

4 голосов
/ 26 марта 2012
  1. setScorer () - это ловушка, Scoreer передается IndexSearcher, когда он фактически выполняет поиск. Таким образом, вы в основном отвергаете этот метод, если вам все равно нужны баллы (например, сохранение пропущенного в Scorer, чтобы вы могли его использовать). Из его javadocs:

    Вызывается перед последовательными вызовами {@link #collect (int)}. Реализации которые нуждаются в оценке текущего документа (переданного в {@link #collect (int)}), должен сохранить переданный Scorer и вызвать Scorer.score () при необходимости.

  2. collect () вызывается для каждого соответствующего документа, передавая для каждого сегмента docid. Обратите внимание, что если вам нужен 'rebased docid' (относительно всего читателя во всех его сегментах), то вы должны переопределить setNextReader, сохранив docBase, и вычислить docBase + docid. От коллекционера ага:

    ПРИМЕЧАНИЕ: документ, который передается в коллекцию Метод относительно текущего читателя. Если твой сборщик должен разрешить это в пространство docID Multi * Reader, вы должны восстановить его, записав docBase из самого последнего вызова setNextReader.

  3. TopDocsCollector - это базовый класс для TopFieldCollector (сортировка по полю) и TopScoreDocCollector (сортировка по оценке). Если вы пишете собственный сборщик, который сортирует по количеству баллов, то, вероятно, проще расширить TopScoreDocCollector.

Также: самый простой пример Collector - TotalHitCountCollector!

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