1. Настройка окружения и подключение к Solr из C# приложения
Настройка окружения и подключение к Solr из C# приложения
Добро пожаловать в курс «Работа с Apache Solr через API на платформе C#». Это первая статья, в которой мы заложим фундамент для всей дальнейшей работы. Прежде чем мы начнем загружать данные, строить сложные фасетные фильтры или настраивать полнотекстовый поиск, нам необходимо выполнить базовую, но критически важную задачу: развернуть сервер Solr и научить наше C# приложение «общаться» с ним.
Apache Solr — это поисковая платформа корпоративного уровня с открытым исходным кодом, построенная на базе библиотеки Apache Lucene. Она невероятно быстрая, масштабируемая и надежная. Но для разработчика самое главное то, что Solr предоставляет удобный REST-like API. Это означает, что мы можем управлять поиском, просто отправляя HTTP-запросы и получая ответы в формате JSON.
!Схема взаимодействия C# приложения и Solr через REST API
Подготовка окружения: Запуск Solr
Существует несколько способов установить Solr: скачать архив с официального сайта, установить через пакетный менеджер (например, Homebrew на macOS) или использовать Docker. В рамках этого курса мы будем использовать Docker, так как это современный стандарт, позволяющий получить гарантированно работающее окружение за одну команду, не засоряя вашу операционную систему зависимостями Java.
Шаг 1: Установка и запуск контейнера
Предполагается, что Docker Desktop уже установлен на вашем компьютере. Откройте терминал (PowerShell, CMD или Terminal) и выполните следующую команду:
Давайте разберем, что делает эта команда:
* docker run — команда запуска контейнера.
* -d (detach) — запускает контейнер в фоновом режиме.
* -p 8983:8983 — пробрасывает порт. Solr по умолчанию работает на порту 8983. Мы связываем порт 8983 вашего компьютера с портом 8983 внутри контейнера.
* --name solr_course_instance — дает нашему контейнеру понятное имя, чтобы мы могли легко к нему обращаться.
* solr:latest — указывает образ, который нужно использовать (последнюю официальную версию Solr).
После выполнения команды подождите несколько секунд. Вы можете проверить, что Solr запустился, открыв браузер и перейдя по адресу http://localhost:8983. Вы должны увидеть административную панель Solr (Solr Admin UI).
Шаг 2: Создание ядра (Core)
Solr не может просто «хранить данные» в пустоте. Ему нужна структура, называемая Core (Ядро) или Collection (Коллекция, если мы говорим о кластерном режиме SolrCloud). Грубо говоря, это аналог базы данных в мире SQL.
Для нашего курса мы создадим ядро с именем techproducts. Мы можем сделать это через интерфейс браузера, но как разработчики, давайте используем командную строку Docker:
Эта команда подключается к нашему работающему контейнеру и выполняет утилиту создания ядра. Если вы увидите сообщение об успехе, значит, хранилище готово к приему данных.
Создание проекта на C#
Теперь, когда сервер запущен, перейдем к клиентской части. Мы будем использовать .NET 6 или новее (подойдет и .NET 8). Мы создадим простое консольное приложение, которое будет служить полигоном для наших экспериментов.
Откройте терминал в папке, где вы храните проекты, и выполните:
Выбор инструментов
Для работы с Solr в .NET существует популярная библиотека SolrNet. Она отличная, мощная и скрывает много сложности. Однако, цель нашего курса — глубокое понимание работы с API. Использование высокоуровневой библиотеки сразу может скрыть от вас то, как именно формируются запросы и как устроены данные.
Поэтому мы будем использовать стандартный HttpClient из пространства имен System.Net.Http. Это позволит нам вручную конструировать запросы и полностью контролировать процесс. Это знание будет универсальным: поняв принципы HTTP API Solr, вы сможете работать с ним на любом языке программирования.
Нам также понадобится библиотека для работы с JSON, так как Solr обменивается данными именно в этом формате. В современных версиях .NET библиотека System.Text.Json уже встроена и отлично справляется с задачей.
Реализация подключения
Откройте файл Program.cs в вашей любимой IDE (Visual Studio, VS Code или Rider). Наша первая задача — просто «постучаться» в Solr и убедиться, что он нам отвечает.
Базовая структура URL
API Solr имеет строгую структуру URL. Для обращения к нашему ядру techproducts базовый адрес будет выглядеть так:
http://localhost:8983/solr/techproducts
Все операции (поиск, добавление, удаление) будут добавляться к этому базовому пути. Например, для поиска мы будем обращаться к /select, а для обновления данных — к /update.
Код проверки соединения (Ping)
У каждого ядра в Solr есть специальный эндпоинт (точка входа) для проверки работоспособности: /admin/ping. Если мы отправим туда GET-запрос, Solr должен вернуть статус OK.
Давайте напишем код для этого. Полностью замените содержимое Program.cs на следующее:
Разбор ключевых моментов кода
wt=json: Обратите внимание на параметр в строке pingUrl. Параметр wt означает Writer Type (тип писателя). По умолчанию Solr старых версий мог возвращать XML. Мы явно указываем wt=json, чтобы гарантированно получить JSON. Это «золотое правило» при работе с Solr API — всегда явно указывать формат.HttpClient: Мы используем static readonly экземпляр. В .NET неправильное использование HttpClient (создание нового экземпляра на каждый запрос) может привести к исчерпанию сокетов (Socket Exhaustion). Для нашего простого приложения это не критично, но мы сразу учимся писать правильно.JsonDocument: Мы используем легковесный парсер из System.Text.Json для анализа ответа. Нам нужно найти поле status и убедиться, что оно равно OK.Запуск и проверка
Запустите приложение командой:
Если вы все сделали правильно, вывод будет примерно таким:
Обратите внимание на структуру JSON-ответа. Она состоит из двух основных частей:
* responseHeader: метаданные запроса (сколько времени занял запрос QTime, статус выполнения status: 0 — это внутренний код успеха Solr, не путать с HTTP 200).
* status: "OK" — это специфичное поле именно для хендлера /admin/ping.
Возможные проблемы
Если вы получили ошибку, проверьте следующее:
docker ps).techproducts и указали его в SolrBaseUrl.?wt=json к запросу.Заключение
В этой статье мы выполнили важнейшую подготовительную работу. Мы развернули поисковый движок Solr в изолированном контейнере, создали индекс (ядро) для хранения данных и написали C# код, который успешно соединяется с API. Мы отказались от использования готовых библиотек в пользу чистого HttpClient, чтобы понимать каждый байт, передаваемый по сети.
В следующей статье мы перейдем к самому интересному — наполнению нашего индекса данными. Мы научимся формировать документы в C# и отправлять их в Solr через API обновления.