Простой поисковый движок с базовой функциональностью индексирования текстовых файлов для последующего поиска. Он представляет собой консольное приложение, работа которого настраивается при помощи конфигурационного файла config.json, а поисковые запросы предоставляются при помощи файла requests.json. После индексации файлов с текстовой информацией и считывания поисковых запросов, движок генерирует answers.json с соответствующими ответами.
Этот проект может быть использован для дальнейшего встраивания в поисковый сервер, работающий в интерактивном режиме, например, на веб или через любой удобный интерфейс взаимодействия. Вся функциональная часть реализована в виде библиотеки, которую можно включить в другом проекте. Также имеется простейшая запускаемая консольная оболочка для демонстрации работы с библиотекой.
Идеей создания этого проекта послужило учебное задание разработать поисковый движок на с++. Собственно проект и есть результат выполнения этого интересного задания.
Для настройки поискового движка предлагается использовать файл config.json. Без этого файла конфигурации приложение не сможет работать. Поэтому, если файл config.json не окажется в том же каталоге, что и исполняемый файл приложения, оно завершит свою работу и выдаст ошибку.
Пример конфигурационного файла config.json:
{
"config": {
"name": "SearchServerEngine",
"version": "0.1",
"max_responses": 5
},
"files": [
"./file001.txt",
"./file002.txt",
"./file003.txt",
"./file004.txt"
]
}
- В секции
config
применяются следующие параметры:name
служит для указания названия приложения;version
указывает для какой версии поискового движка этот файл. Если версии не совпадут, то приложение выдаст ошибку;max_responses
устанавливает количество ранжированных ответов для каждого запроса. Этот параметр удобен для отсеивания несущественных результатов.
- В секции
files
перечисляются файлы с текстом, по которым будет производиться поиск.
Приложение автоматически обходит указанные текстовые документы и строит поисковый индекс.
Настоящая версия поискового движка рассчитана на обработку текстов, со словами состоящих из латинских букв, разделённых одним или несколькими пробелами. Каждый документ может содержать не более 1000 слов с максимальной длиной каждого слова не более 100 символов.
Поисковые запросы представляют собой набор слов, разделённых пробелами, для которых нужно найти наиболее вероятные текстовые документы, в которых они встречаются. Запросы должны перечисляться в виде списка в файле requests.json.
Пример requests.json:
{
"requests": [
"milk water",
"sugar"
]
}
В настоящей версии поискового движка можно задать не более 1000 запросов и каждый запрос может включать в себя не более 10 слов.
Сопоставив поисковые запросы с созданным индексом вхождения слов в текстовые документы, поисковый движок создаёт файл answers.json с результатами, показывающими, насколько часто слова из запроса встречаются в каждом исходном текстовом документе.
Пример answers.json:
{
"answers": {
"request001": {
"relevance": [
{
"docid": 2,
"rank": 1.0
},
{
"docid": 0,
"rank": 0.699999988079071
},
{
"docid": 1,
"rank": 0.30000001192092896
}
],
"result": "true"
},
"request002": {
"result": "false"
}
}
}
Где answers
содержит список пронумерованных первоначальных запросов. Секции запросов типа requestNNN
могут содержать различные результаты:
-
Если слова из запроса не встречаются ни в одном текстовом документе, то единственным полем в нём будет
"result": "false"
-
Если слова из запроса встречаются только в одном документе, то секция запросы будет выглядеть следующим образом::
"request003": { "docid": 3, "rank": 1.0, "result": "true" }
-
Если слова из запроса встречаются в нескольких файлах, то секция с результатами для запроса будет выглядеть примерно так:
"request001": { "relevance": [ { "docid": 2, "rank": 1.0 }, { "docid": 0, "rank": 0.699999988079071 }, { "docid": 1, "rank": 0.30000001192092896 } ], "result": "true" },
doc_id
- это номер текстового документа в списке files
из config.json. rank
- это относительная релевантность, показывающая, насколько часто слова из запроса встречаются в данном текстовом документе.
Для реализации проекта применялись:
- Язык программирования С++17;
- Для создания тест кейсов - QtTest (Qt 5.15.2 или новее);
- Для запуска тестов используется ctest, но так же можно использовать IDE например QtCreator;
- Для управления сборкой компонентов проекта - CMake 3.20 или новее
- Сборка проекта - make,GNU C++ compiler (g++13 или новее)
Разработка и проверка работоспособности велась под OS Linux.
Данное приложение должно использоваться как библиотека в составе другого проекта, но для проверки работоспособности есть возможность запустить в составе демо приложения, которое собирается в каталоге examples. В проекте содержится набор теcтов для проверки работоспособности поискового движка, при помощи которых можно убедиться в работоспособности библиотеки.
Перед выполнением инструкций в одном из следующих пунктов нужно выполнить подготовительные действия перед сборкой проекта.
Для клонирования проекта в каталог для установки исходного кода:
git clone git@github.com:greyshaman/simple-search-server.git
Перейти в каталог simple-search-server:
cd simple-search-server
Создать каталог build и потом перейти в него:
mkdir build
cd build
Для демонстрации работы поискового движка он будет собран и установлен в каталог build/examples/demo
.
Сгенерировать конфигурацию для сборки проекта вместе с примерами (так как по умолчанию демо не собирается):
cmake -DSEARCH_ENGINE_BUILD_EXAMPLES=ON ..
Запускаем сборку:
cmake --build .
Если всё собралось, то переходим в каталог demo:
cd build/demo
В каталоге должны быть исполняемый файл который запускает демонстрацию search-engine-demo и файлы конфигурации config.json, запросов requests.json и текстовые документы file001.txt, file002.txt, file003.txt, file004.txt по которым будет производится поиск. Запускаем приложение:
./search-engine-demo
После выполнения программы:
Starting SearchServerEngine version 0.1
Texts are indexed
Reading requests
Search results complete and will write into result file
Answers wrote into file
Program complete. Thank you.
Bye
в каталоге demo появится answers.json с результатами поиска согласно заданых запросов
Далее изменяя запросы или тексты можно запустить повторно и поэкспериментировать с поисковым движком.
Сгенерировать конфигурацию для сборки проекта вместе с тестами (так как по умолчанию тесты не собираются):
cmake -DSEARCH_ENGINE_BUILD_TESTS=ON ..
Запускаем сборку:
cmake --build .
Если всё собралось, тогда можно запустить тесты на исполнение:
ctest -VV
Результаты тестов будут изображены в консоли после исполнение ctest
команды.
Для того чтобы использовать поисковый движок нужно собрать проект и установить его и тогда использовать скомпиллированную библиотеку. Или скопировать весь проект в корень другого проекта который будет использовать функционал поискового движка и использовать как подпроект.
Перед сборкой проекта конфигурируем сборщик:
cmake ..
Собираем:
cmake --build .
Инсталлируем (скорее всего будут необходимы администраторские привилегии):
sudo cmake --install .
После успешной установки бибилиотеки она может быть включена в другой проект
Добавление библиотеки в CMakeLists.txt другого проекта:
find_package(SearchEngine REQUIRED)
После копирования каталога проекта поискового движка в корень другого разрабатываемого проекта прописываем в CMakeLists.txt нового проекта:
add_subdirectory(simple-search-server)
include_directories(SYSTEM simple-search-server/include)
Краткую документацию по API библиотеки можно найти в папке docs. Достаточно открыть index.html в браузере.