Full-text search system FTS

FTS – веб приложение поиска по оцифрованным книгам и диссертациям. Позволяет искать не только по библиографическим данным, но и по всему тексту документа. Приложение обрабатывает документы с большим объемом текста, в частности отсканированные и распознанные, а также старые, с низким качеством сканирования.

Что мы сделали

  • Полнотекстовый поиск для больших объемов данных.

    В отличии от поиска по сайту, при поиске по книгам каждый документ больше по размеру в десятки, а то и сотни раз. При этом, не все поля одинаково важны. Правильный баланс между расширенными возможностями поиска и отсечением всего лишнего позволил нам достичь высокой производительности. Так, мы добились 10 запросов в секунду при поиске по хранилищу из более 600 000 документов (более 300 гигабайт текста), используя всего лишь один сервер с двухядерным процессором. При необходимости, поиск может успешно использовать ресурсы нескольких серверов. Эфективное использование ресурсов и готовность к масштабированию позволили внедрить систему поиска без расширения серверной инфраструктуры заказчика.

  • Поддержка морфологии.

    Русский язык содержит множество форм каждого слова. Работающий для английского языка вариант с отсечением конца слова, для русского работает плохо. Для решения этой проблемы мы воспользовались opensource решением AOT (автоматическая обработка текста), которое позволяет приводить слова к нормальной форме. В итоге, мы получили более релевантные результаты поиска как по множеству тестовых запросов, так и по субъективному ощущению фокус-группы.

  • Быстрые изменения в данных в поисковой базе.

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

  • Объединение реализаций поиска.

    Любое техническое решение полезно, если оно решает не технические проблемы. Чтобы убрать множество отдельных реализаций поиска, мы собрали требования и реализовали интерфейс взаимодействия (API), который может использоваться разработчиками других систем. В результате, поиск стал работать единообразно и освободились сервера, занятые другими реализациями поиска. Кроме того, процесс добавления поиска в новую систему является быстрым и дешевым.

  • Документация для разработчиков.

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

Тестирование

В проекте использовался mercurial, redmine, jmeter. Подробней - на странице как мы работаем.

Больше технических подробностей

  • Операционная система: Ubuntu x64
  • Поисковый сервер: Sphinx search
  • Индексатор: язык программирования c#, выполнение в mono runtime.
  • Веб интерфейс: язык программирование php, запуск с помощью php-fpm
  • Хранение данных: MySQL в качестве основного хранилища, Redis для часто используемых данных

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

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