Цель дипломной работы - разработать класс поискового движка, который способен быстро находить указанное слово среди pdf-файлов, причём ранжировать результаты по количеству вхождений. Также нужно разработать сервер, который обслуживает входящие запросы с помощью этого движка.
В проекте были заготовки кода:
Класс | Описание |
---|---|
Main |
Изначально в нём находилась заготовка использования поискового движка. После его реализации, содержимое main я заменил на запуск сервера, обслуживающего поисковые запросы |
PageEntry |
Класс, описывающий один элемент результата одного поиска. Он состоит из имени пдф-файла, номера страницы и количества раз, которое встретилось это слово на ней |
SearchEngine |
Интерфейс, описывающий поисковый движок. Всё что должен уметь делать поисковый движок, это на запрос из слова отвечать списком элементов результата ответа |
BooleanSearchEngine |
Реализация поискового движка, которую мне было необходимо написать |
Для работы с пдф я использовал библиотеку com.itextpdf:itext7-core:7.1.15
.
Реализация класса BooleanSearchEngine
. Для того, чтобы поиск работал быстро, предусмотрено сканирование всех пдф-ок в конструкторе класса с сохранением информации для каждого слова, чтобы метод search
отрабатывал быстро, по сути возвращая уже посчитанный в конструкторе для слова ответ. Т.е. в конструкторе для каждого слова сохраняется готовый на возможный будущий запрос ответ List<PageEntry>
(для этого используется мапа, где ключом будет слово, а значением - поисковый ответ для него). Такое предварительное сканирование файлов, по которым мы будем искать, называется индексацией.
В итоге, я реализовал логику индексации в конструкторе. Сканируя каждый пдф-файл, мы перебираем его страницы, для каждой страницы извлекаем из неё слова и подсчитываем их количество. После чего, для каждого уникального слова создаём объект PageEntry
и сохраняем в список List<PageEntry>
, который затем передаем в мапу. Также предусмотрен регистронезависимый поиск, т.е. по слову "бизнес" учитывается и "бизнес", и "Бизнес" в документах (для этого при обработке каждое слово переводится в нижний регистр с помощью встроенного метода класса String
для этих целей).
Списки ответов для каждого слова отсортированы в порядке уменьшения поля count
. Для этого класс PageEntry
реализует интерфейс Comparable
.
Для реализации работы поискового движка в main
запускается сервер, слушающий порт 8989
, к которому будут происходить подключения от клиента Client
и на входной поток подавать одно слово (обозначим как word
). Отвечать сервер будет результатом вызова метода search(word)
, но в виде JSON-текста.