C++

Как написать простой поисковик на C++

Простой поисковик на C++ можно сделать так: хранить список текстов в std::vector<std::string>, приводить запрос и документы к одному регистру, искать подстроку через find и выводить найденные строки. Это не Google и не полнотекстовый индекс, но хороший первый проект для строк, циклов и функций

Минимальный пример

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

std::string toLower(std::string text) {
    std::transform(text.begin(), text.end(), text.begin(),
        [](unsigned char c) { return std::tolower(c); });
    return text;
}

int main() {
    std::vector<std::string> documents {
        "C++ string find example",
        "Visual Studio Code setup",
        "How to read file in C++"
    };

    std::string query;
    std::cout << "Search: ";
    std::getline(std::cin, query);

    std::string normalizedQuery = toLower(query);

    for (const std::string& document : documents) {
        std::string normalizedDocument = toLower(document);

        if (normalizedDocument.find(normalizedQuery) != std::string::npos) {
            std::cout << document << '\n';
        }
    }
}

Если ввести code, программа найдет строку Visual Studio Code setup

Как работает find

document.find(query) ищет подстроку. Если подстрока найдена, возвращается позиция. Если не найдена, возвращается std::string::npos

Проверка выглядит так:

if (text.find(word) != std::string::npos) {
    std::cout << "found\n";
}

Для новичка это самый простой способ сделать поиск по строке

Зачем нужен lower-case

Без приведения к нижнему регистру запрос code не совпадет с Code, если сравнение чувствительно к регистру. Поэтому мы приводим и запрос, и документ к одному виду. Исходный документ при этом выводим как был, чтобы не портить текст

Для русского текста тема сложнее: кодировки, локаль и Unicode требуют отдельной обработки. Для первого проекта лучше проверить английские строки, а потом отдельно изучить русскоязычный ввод

Как улучшить проект

Следующий шаг — хранить не просто строки, а структуру:

struct Document {
    int id;
    std::string title;
    std::string text;
};

Тогда можно искать по заголовку и тексту, а выводить id и title. Еще один шаг — читать документы из файла, а не держать их в коде

Как вывести номер результата

Чтобы пользователь понимал, что найдено, выводите номер документа:

for (std::size_t i = 0; i < documents.size(); ++i) {
    std::string normalizedDocument = toLower(documents[i]);

    if (normalizedDocument.find(normalizedQuery) != std::string::npos) {
        std::cout << "#" << i << ": " << documents[i] << '\n';
    }
}

std::size_t подходит для индексов контейнеров. Так результат можно использовать дальше: открыть документ, показать подробности или сохранить id найденной строки

Что считать поисковиком

Такой пример ищет только подстроку. Он не понимает формы слов, опечатки, синонимы и релевантность. Но это нормальный первый шаг: вы уже получаете ввод, проходите коллекцию, сравниваете строки и выводите результаты. Дальше можно добавить разбиение на слова, подсчет совпадений, чтение файлов и простой индекс слово -> список документов

Если запрос пустой, лучше не показывать все документы подряд:

if (normalizedQuery.empty()) {
    std::cout << "Empty query\n";
    return 0;
}

Такая проверка делает поведение программы предсказуемым

Еще полезно вывести количество совпадений. Тогда пользователь видит не только сами строки, но и итог: найдено 0, 2 или 10 документов

Частые ошибки

Первая ошибка — сравнивать строки через ==, хотя нужен поиск внутри текста. Вторая — забыть std::string::npos. Третья — не нормализовать регистр. Четвертая — ждать от find морфологию, исправление опечаток и поиск по словам. Простой find ищет ровную подстроку

Мини-задача: добавьте пять документов, запрос через getline, счетчик найденных результатов и сообщение Ничего не найдено, если совпадений нет

Что почитать дальше по C++

Что почитать дальше по C++

Если нужен общий маршрут по теме, откройте рубрику C++. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x