Как определить дату в произвольном текстовом поисковом запросе Lucene? - PullRequest
5 голосов
/ 09 июня 2011

Мы используем Lucene для разработки поля произвольного текстового поиска для данных, доставляемых пользователю, как в случае папки «Входящие» электронной почты. Мы хотели бы разрешить для коробки обрабатывать даты, например 5/1/2011. Чтобы упростить задачу, мы ограничиваем текущую версию функции только двумя форматами даты:

mm/dd/yy
mm/dd/yyyy

Для нашего прототипа мы взломали процесс анализа запросов, чтобы попытаться предварительно обработать строку запроса для поиска этих двух шаблонов дат. Это было около 2 лет назад, и мы были на Lucene 2.4. Мне любопытно посмотреть, есть ли в Lucene какие-либо встроенные инструменты для принятия DateFormat и возврата TokenStream с любыми указанными датами. Просматривая javadocs для Lucene 2.9, я нашел класс:

org.apache.lucene.analysis.sinks.DateRecognizerSinkFilter

, который, кажется, делает то, что мне нужно, но он реализует SinkFilter, концепцию, которая, похоже, не документирована в Lucene Wiki. Кто-нибудь использовал этот фильтр раньше, и если да, то как его наиболее эффективно использовать?

1 Ответ

1 голос
/ 16 июня 2011

В документации для TeeSinkTokenFilter есть немного примера кода (который, по общему признанию, является слишком сложным). Обратите внимание, что способ DateRecognizerSinkFilter разработан, он не хранит фактическую дату; он просто обнаруживает, что токен является датой, соответствующей указанному формату. Я бы попытался повторно реализовать класс DateRecognizerSinkFilter, чтобы получить массив экземпляров DateFormat, создать новый класс Attribute с именем DateAttribute (или что-то подобное) и использовать подкласс распознавателя даты, чтобы установить проанализированный день в DateAttribute, если один из его форматы совпадают. Таким образом, вы всегда можете проверить, есть ли у вас действительная дата, путем опроса атрибута DateAttribute и локализовать форматы даты для одного класса. Другое преимущество заключается в том, что вам не придется обрабатывать несколько приемников, что упрощает код из связанного примера.

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