Скажите Пару Слов О Локальном Поиске

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

Желательно было искать не только по названию файла, но и по содержимому.

В то время еще были популярны локальные поисковые системы, такие как Архивариус, и даже у Яндекса была отдельная поисковая система.

Но это не были корпоративные решения; их нельзя было централизованно развернуть для совместного использования.

Яндекс, ради честности, начал делать что-то похожее , но потом отказался от этого.

Но во всех этих решениях не было того, что мне нужно:

  • Централизованная установка
  • Результаты поиска с учетом прав доступа
  • Поиск по содержимому документа
  • Морфология
И я решил сделать свой.

Я объясню по пунктам, что я имею в виду, чтобы избежать различных интерпретаций и недоразумений.

Централизованная установка – клиент-серверное исполнение.

У всех перечисленных выше решений есть одна принципиальная проблема — каждый пользователь создает свой локальный поисковый индекс, что в случае больших объемов хранения задерживает индексацию, увеличивает профиль пользователя на машине и вообще неудобно в случае прихода нового сотрудника или переезд на новую машину.

Результаты поиска с учетом прав – здесь все просто – результаты должны соответствовать правам сотрудника на файловый ресурс.

В противном случае получается, что даже если у сотрудника нет прав на ресурс, он может прочитать всё из кэша поиска.

Это будет неловко, вы согласны? Поиск по содержимому документа - поиск по тексту документа, здесь все очевидно, как мне кажется, и никаких расхождений быть не может. Морфология еще проще.

Мы указали в запросе «нож» и получили и «нож», и «ножи», «нож» и «нож».

Хотелось бы, чтобы это работало на русском и английском языках.

С постановкой задачи определились, можно переходить к реализации.

В качестве поисковой системы я выбрал систему Sphinx, а языком разработки интерфейса — C# и .

net, в результате проект получил название Vidocq в честь французского сыщика.

Ну типа он все найдет и все.

Архитектурно приложение выглядит так: Поисковый робот рекурсивно обходит файловый ресурс и обрабатывает файлы в соответствии с заданным списком расширений.

Обработка заключается в получении содержимого файла, сжатии текста – из текста удаляются кавычки, запятые, лишние пробелы и т.п.

, затем содержимое помещается в базу данных (MS SQL), делается пометка о дате размещение, и робот движется дальше.

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

На C# была разработана форма, которая взаимодействовала со Sphinx через соединитель MySQL. Sphinx предоставляет массив файлов в соответствии с запросом, затем массив фильтруется по правам доступа пользователя, выполняющего поиск, вывод форматируется и показывается пользователю.

Нам понадобится сохранить следующую информацию о файле:

  • Идентификатор файла
  • Имя файла
  • Путь к файлу
  • Содержимое файла
  • Расширение
  • Дата добавления в базу данных
Это все делается в одной таблице и поисковый робот все туда добавит. Дата добавления необходима для того, чтобы при следующем обходе робот сравнил дату изменения файла с датой его помещения в базу данных, и если даты различаются, то обновил информацию о файле.

Далее настройте саму поисковую систему.

Весь конфиг я описывать не буду, он будет доступен в архиве проекта, а осветлю лишь основные моменты.

Основной запрос, формирующий базу данных исходные документы: document_base

   

{

Теги: #.

NET #Ненормальное программирование #поиск #сфинкс #Я сделал

Вместе с данным постом часто просматривают: