Пользовательская оценка Lucene (Lucene 3.2) включает в себя итерацию по всем документам в индексе - самый быстрый способ? - PullRequest
3 голосов
/ 27 июня 2011

Я пытаюсь реализовать пользовательскую формулу оценки в Lucene, которая не имеет ничего общего с tf-idf (поэтому изменение только подобия, например, не будет работать).

Чтобы сделать это, мне нужно иметь возможность взять свой собственный запрос и сгенерировать оценку для каждого документа, хранящегося в индексе, а не только для тех, которые соответствуют условиям в запросе (поскольку моя оценка включает в себяпроверка того, что по сути является синонимами, поэтому, даже если у документа нет точных Условий, он все равно может дать положительный результат).Является ли лучший способ просто создать IndexReader и вызвать Document d = reader.doc(i) для всех документов (как описано здесь ), а затем создать счет на месте?

Я искал вокругпри подсчете внутренних баллов Lucene, в частности, различных классов Scorer и Collector, и кажется, что то, что происходит (для Lucene 3.2), представляет собой Weight, предоставляет Scorer, который вместе с Collector просматривает все документы, соответствующие запросу.Могу ли я использовать эту структуру каким-то образом, но снова получить пользовательскую реализацию Scorer для учета ВСЕХ документов?

Ответы [ 3 ]

2 голосов
/ 18 декабря 2011

Если вы решите использовать собственную схему подсчета очков, правильным способом будет использование подкласса CustomScoreQuery с переопределением getCustomScoreProvider для возврата подкласса CustomScoreProvider.Конструктор CustomScoreQuery требует подзапроса.Здесь вы захотите предоставить быстрый собственный Lucene Query, который максимально сузит набор результатов, прежде чем приступить к выполнению пользовательского расчета баллов.Вы также можете организовать хранение любого числа значений с плавающей запятой в каждом из ваших документов и сделать их доступными для вашего собственного поставщика результатов.Вам нужно будет предоставить соответствующий ValueSourceQuery конструктору CustomScoreQuery для каждого такого значения с плавающей запятой.Посмотрите Javadocs на этих классах, они хорошо написаны.К сожалению, у меня нет фрагмента Java под рукой.

0 голосов
/ 28 июня 2011

С помощью IndexReader.termDocs вы можете перебирать список публикаций термина, то есть все документы, содержащие этот термин. Вы можете использовать это, чтобы обеспечить свою собственную обработку запросов собственной версией Lucene, но тогда вы не сможете использовать любой из Query, Similarity и прочее.

Также, если вы работаете с синонимами В Lucene есть некоторые вещи в пакете contrib . Другое возможное решение, не знаю, пытались ли вы это сделать, - ввести синонимы в документы с помощью Analyzer (или другого). Таким образом, вы можете вернуть документы, даже если у них нет условий запроса.

0 голосов
/ 27 июня 2011

Как я понимаю, Lucene хранит пары (term, doc) в своем индексе, так что запрос реализован как

  1. Получить документы, содержащие условия запроса,
  2. оценка /отсортировать их.

Я никогда не реализовывал свою собственную оценку, но сначала посмотрю на IndexReader.termDocs;Кажется, для реализации шага 1.

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