Типичная поисковая система работает следующим образом:
- Входная строка маркируется, разбивается на границах слов - начало / конец смещения символов связывается с каждым токеном
- Каждый жетон затем останавливается - я бы использовал
Lingua::Stem
(или, лучше, Lingua::Stem::Snowball
), которые являются слегка обновленными версиями стеммера Портера - Каждый жетон с его исходным смещением символов начало / конецсохраняется и индексируется, как правило, вместе с копией исходного текста до его токенизации.По сути, это таблица, которая связывает термин «текст» с исходным документом (обычно в качестве идентификатора).
Теперь, когда приходит запрос, он тоже токенизируется, и каждый токен связан, но мы этого не делаем.заботиться о позициях на этот раз.Мы сравниваем каждый токен с индексированными, чтобы найти записи (соответствующие идентификаторы документа).Теперь мы можем извлечь сохраненные начальные / конечные смещения, чтобы определить, где термины были в исходном тексте.
Таким образом, вы теряете суффиксы для index (что и использовалось для поиска подходящих документов), но вы сохраняете исходный текст и смещения для этих документов, поэтому вы можете выполнить запросПодсветка и приятный дисплей, если вам нужно.
Стебминг, безусловно, является подходящим инструментом для этой работы.Основной трюк заключается в том, чтобы вы относились к запросу и документам одинаково.Вы можете изменить исходный документ, но на самом деле вы хотите преобразовать его во что-то вроде заднего указателя книги, а не в строку, на которой вы используете регулярные выражения - если вы действительно делаете вещи для поисковых систем, то есть.Проверьте отличный модуль KinoSearch
на CPAN, если хотите, или посмотрите на проект Apache Lucene, из которого он изначально был получен.