Точный поиск по фразе с использованием lucene без увеличения количества полей

Для поиска по фразе мы хотим выводить результаты только при наличии точного совпадения (без игнорирования стоп-слов). Если это нефразовый поиск, мы нормально отображаем результаты, даже если корневая форма слова совпадает и т. д.

В настоящее время мы передаем наши данные через standardTokenizer, StopFilter, PorterStemFilter и LowerCaseFilter. Из-за этого, когда пользователь хочет найти «управление паролями», поиск выдает результаты, содержащие «менеджер паролей».

Если я удалю StemFilter, то не смогу сопоставить корневую форму слова для нефразовых запросов. Я думал, должен ли я индексировать одни и те же данные как часть двух полей в документе.

Я задал тот же вопрос в разделе Разные стратегии индексации и поиска в одном и том же поле без удвоения размера индекса?. Однако людям в офисе не нравится индексировать одни и те же данные как часть двух полей. (в настоящее время у нас есть около 20 текстовых полей в документе lucene). Есть ли способ поддержать оба случая, которые я перечислил выше, используя TokenFilters?

Скажем, для StopFilter внесите изменения, чтобы он выдавал как входной токен, так и ? (для игнорируемого слова) с одинаковыми приращениями позиции. Точно так же для StemFilter он выдает как входной токен, так и базовый токен с одинаковыми приращениями позиции. В основном входные и выходные токены (даже игнорируемые) имеют одинаковые позиции.

Безопасно ли продолжать использовать этот подход? Кто-нибудь еще сталкивался с перечисленными здесь требованиями? Есть ли доступные фильтры, которые делают что-то похожее на то, что я упомянул в своем подходе?

Спасибо


person naresh    schedule 02.01.2012    source источник


Ответы (1)


Я не понимаю, что вы подразумеваете под «токенами ввода и вывода». Сохраняете ли вы данные дважды — один раз в виде основы и один раз без основы?

Если вы не сохраните его дважды, я не думаю, что ваш метод сработает. Предположим, сохраненное слово jumping, и они ищут jumped. Ваш синтаксический анализатор запросов может выдать jump и jumped, но он все равно не будет соответствовать jumping, если у вас нет значения, сохраненного как jump.

И если вы собираетесь сохранить значение один раз в виде основы и один раз как не в основе, то почему бы просто не сохранить его в двух полях? Тогда вам не придется иметь дело со странными изменениями токенизатора.

person Xodarap    schedule 02.01.2012
comment
@Xodarp: Да, план состоит в том, чтобы сохранить его дважды, не используя два поля (просто для упрощения процесса преобразования языка запросов приложения в запросы Lucene). Есть ли у вас идеи, так ли реализованы поисковые системы? Спасибо - person naresh; 02.01.2012
comment
У большинства поисковых систем есть мнение, что хранение дешево, а задержка — дорого, поэтому они, как правило, идут по пути избыточного хранения вещей. Есть ли у Google несколько полей (или даже идея полей), я не могу сказать. - person Xodarap; 02.01.2012
comment
Я должен добавить: если вы внесете эти изменения в токенизатор, у вас возникнут всевозможные проблемы с подсветкой и т. Д. Тщательно подумайте, действительно ли проще исказить код Lucene, чем выполнить перевод. - person Xodarap; 02.01.2012