Skip to content

greyshaman/simple-search-server

Repository files navigation

Simple Search Engine

Простой поисковый движок с базовой функциональностью индексирования текстовых файлов для последующего поиска. Он представляет собой консольное приложение, работа которого настраивается при помощи конфигурационного файла 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 документация

Краткую документацию по API библиотеки можно найти в папке docs. Достаточно открыть index.html в браузере.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published