Как мне выполнить полнотекстовый поиск плоских файлов с помощью Perl? - PullRequest
3 голосов
/ 26 февраля 2009

У нас есть веб-приложение на основе Perl, данные которого берут начало из огромного хранилища текстовых файлов. Эти плоские файлы помещаются в каталог в нашей системе, мы тщательно анализируем их, вставляя биты информации в базу данных MySQL, и затем перемещаем эти файлы в их архивное хранилище и постоянное хранилище (/www/website/archive/*.txt). Теперь мы не анализируем каждый бит данных из этих плоских файлов, и некоторые из более неясных элементов данных не попадают в базу данных.

В настоящее время существует требование, чтобы пользователи могли выполнять полнотекстовый поиск по всему хранилищу плоских файлов с веб-страницы, созданной на Perl, и возвращать список обращений, по которым они могли бы затем щелкнуть и открыть текстовые файлы для просмотра.

Какой самый элегантный, эффективный и не требующий значительных ресурсов ЦП метод для включения этой функции поиска?

Ответы [ 4 ]

9 голосов
/ 27 февраля 2009

Я бы порекомендовал, в следующем порядке:

  1. Всасывайте весь каждый документ в таблицу MySQL и используйте функции полнотекстового поиска и индексации MySQL. Я никогда не делал этого, но MySQL всегда был способен обрабатывать больше, чем я могу бросить на это.

  2. Swish-E (http://swish -e.org / ) все еще существует и предназначен для построения полнотекстовых индексов и позволяет ранжировать результаты. Я управлял им в течение нескольких лет, и он работает довольно хорошо.

  3. Вы можете использовать File :: Find в своем Perl-коде для просмотра хранилища, как grep -r, но это будет отстой по сравнению с одним из индексированных параметров выше. Тем не менее, это будет работать, и может даже удивить вас:)

3 голосов
/ 26 февраля 2009

Я рекомендую использовать специальную поисковую систему для индексации и поиска.

Я недавно не смотрел на поисковые системы, но несколько лет назад использовал ht: // dig и был доволен результатами.

Обновление: Похоже, ht: // dig - проект зомби на данный момент. Вы можете использовать другой двигатель. Hyper Estraier , помимо того, что он непроизносим, ​​выглядит многообещающе.

2 голосов
/ 27 февраля 2009

Я рекомендую добавить индексную машину. Рассмотрим Namazu из http://namazu.org. Когда мне это было нужно, начать было проще, чем Swish-e, ht: // dig, и я вполне доволен этим.

Если вам не нужны служебные данные индексатора, посмотрите на разветвление grep / egrep. Как только объем текста перейдет в несколько мегабайт, это будет значительно быстрее, чем сканирование исключительно на Perl, например:

open GREP, "find $dirlist -name '$filepattern' | xargs egrep '$textpattern' |"
                                         or die    "grep: $!";
while (<GREP>)  {
       ...
}

Бонус: используйте соглашения об именах файлов, такие как даты / теги / и т. Д., Чтобы сократить набор файлов до grep. Неуклюжий find ... | xargs ... предназначен для обхода ограничений на размер оболочки при расширении с использованием подстановочных знаков, которые могут возникнуть при работе с большими архивами.

0 голосов
/ 03 марта 2009

Я вижу, кто-то рекомендовал Lucene / Plucene. Проверьте KinoSearch , я использую это в течение года или более для проекта на основе Catalyst, очень доволен производительностью и простотой программирования / обслуживания.

Предостережение на этой странице должно быть учтено при ваших обстоятельствах, но я могу засвидетельствовать стабильность модуля.

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