SRU (Search/Retrieve via URL) – протокол поиска и извлечения данных

Раскрываем тайну SRU — невидимого двигателя библиотек и архивов. Узнайте, как этот протокол управляет поиском за кулисами Google и Яндекса.

В мире профессионального поиска информации, библиографических систем и корпоративных баз данных существует стандарт, который остается «невидимым двигателем» для многих современных сервисов. Этот стандарт — SRU (Search/Retrieve via URL). Несмотря на то, что обычные пользователи привыкли к строкам поиска Google или Яндекс, SRU лежит в основе взаимодействия между серьезными информационными системами, библиотечными каталогами, архивами и научными репозиториями.

В этой статье мы подробно разберем, что такое SRU, как он работает, чем отличается от привычного веб-поиска и почему он критически важен для автоматизации сбора данных и OSINT (разведки по открытым источникам).


Определение и история возникновения

SRU (Search/Retrieve via URL) — это протокол поиска и извлечения данных, основанный на стандарте CQL (Contextual Query Language) и транспорте HTTP/HTTPS. Он был разработан техническим комитетом OASIS как современная замена старому протоколу Z39.50 (стандарт ANSI/NISO Z39.50-1995), который использовался в библиотечной автоматизации с 1980-х годов.

Ключевые этапы эволюции:

  • Z39.50: Бинарный протокол на базе TCP/IP (порт 210). Мощный, но сложный в реализации, требовал специального клиентского ПО, плохо работал через файрволы и NAT.
  • SRW (Search/Retrieve Web Service): Промежуточный вариант на базе SOAP/XML. Стандартизирован, но «тяжелый» из-за обертки SOAP.
  • SRU (Search/Retrieve via URL): Легковесная версия. Запросы передаются параметрами URL (GET), ответы — в XML (или JSON). Простота интеграции в веб-приложения сделала его де-факто стандартом для современных библиотек и репозиториев.

Суть SRU: Это стандартный способ задать вопрос базе данных по HTTP и получить структурированный ответ, понятный машине, а не человеку.


Как работает SRU: Техническая архитектура

Взаимодействие по протоколу SRU строится на простой схеме «Запрос — Ответ» через обычный HTTP.

Базовый URL эндпоинта

Каждая система, поддерживающая SRU, предоставляет базовый адрес (endpoint), например:

https://api.library.example.com/sru

Обязательные параметры запроса (GET)

Параметр Описание
operation Тип операции: searchRetrieve (поиск), explain (описание возможностей сервера), scan (просмотр терминов/автозаполнение).
version Версия протокола (обычно 1.1 или 1.2).
query Строка запроса на языке CQL (Contextual Query Language).
maximumRecords Максимальное количество записей в ответе (пагинация).
startRecord Номер записи, с которой начинать выдачу (для постраничной навигации).
recordSchema Формат записи в ответе (например, dc — Dublin Core, marcxml — MARC21, mods — MODS).
recordPacking Упаковка: xml (по умолчанию) или json (в версиях 1.2+).

Пример реального запроса

Поиск книг автора «Толстой» в каталоге, поддерживающем SRU:

https://catalog.example.org/sru?operation=searchRetrieve&version=1.1&query=dc.creator%20all%20%22Толстой%22&maximumRecords=10&recordSchema=dc


Язык запросов CQL (Contextual Query Language)

Это «сердце» SRU. В отличие от SQL (для реляционных БД) или простых ключевых слов (для веб-поисковиков), CQL позволяет строить точные, контекстно-зависимые запросы к полям метаданных.

Базовый синтаксис

Индекс(поле) Оператор(отношение) "Значение"

Основные операторы (Relations)

  • all, все слова в любом порядке (аналог AND).
  • any — хотя бы одно слово (аналог OR).
  • exact — точная фраза.
  • within / encloses, вхождение строки / строка содержит.
  • =, >, <, >=, <= — числовые/датированные сравнения.
  • scr (Server Choice) — сервер сам выбирает лучшее совпадение (релевантностный поиск).

Логические комбинаторы

  • and, or, not — стандартная булева логика.
  • prox — поиск по близости слов (например, слова рядом в пределах N слов).

Примеры CQL-запросов

  1. Простой: title all "машинное обучение"
  2. По автору и году: dc.creator exact "Иванов" and dc.date > "2020"
  3. Сложный (близость): "искусственный интеллект" prox/distance<=5 "этика" (слова в пределах друг от друга).
  4. По идентификатору: bath.isbn exact "978-5-17-123456-7"

Важно: Список поддерживаемых индексов (dc.title, dc.creator, bath.isbn и т.д.) определяется конкретным сервером. Узнать их можно через операцию explain.


Структура ответа (упрощенно)

<srw:searchRetrieveResponse xmlns:srw="http://www.loc.gov/zing/srw/">
 <srw:version>1.1</srw:version>
 <srw:numberOfRecords>142</srw:numberOfRecords>
 <srw:records>
 <srw:record>
 <srw:recordSchema>dc</srw:recordSchema>
 <srw:recordPacking>xml</srw:recordPacking>
 <srw:recordData>
 <dc:title>Основы SRU</dc:title>
 <dc:creator>Петров И.И.</dc:creator>
 <dc:date>2023</dc:date>
 <dc:identifier>urn:isbn:1234567890</dc:identifier>
 </srw:recordData>
 <srw:recordPosition>1</srw:recordPosition>
 </srw:record>
 ...
 </srw:records>
 <srw:nextRecordPosition>11</srw:nextRecordPosition>
 <srw:echoedSearchRetrieveRequest>...</srw:echoedSearchRetrieveRequest>
</srw:searchRetrieveResponse>

SRU vs Веб-поиск (Google/Яндекс) vs API (REST/GraphQL)

Почему не просто использовать Google Custom Search API или REST API конкретного сайта?

Характеристика Веб-поиск (Google/Yandex) Типичный REST API SRU / CQL
Стандартизация запросов Нет (каждый поисковик свой синтаксис) Нет (у каждого API своя схема) Да (ISO/IEC 23950, OASIS Standard)
Точность поиска по полям Низкая (полнотекстовый по всему вебу) Зависит от разработчика API Высокая (индексы: автор, ISBN, ISSN, предметная рубрика, дата)
Структура ответа JSON (произвольная схема) XML/JSON по стандарту (Dublin Core, MARC, MODS)
Интероперабельность Нет (закрытые экосистемы) Нет (vendor lock-in) Да (один клиент работает с тысячами каталогов)
Сложные логические запросы Ограничены (site:, filetype:, OR) Редко поддерживаются полностью Полная поддержка CQL (близость, диапазоны, булева логика)
Основной сценарий Поиск в открытом вебе Интеграция с конкретным сервисом Федеративный поиск по каталогам, архивам, репозиториям

Где применяется SRU на практике

Библиотечные системы и Федеративный поиск (Discovery)

Системы вроде Primo (Ex Libris), Summon (ProQuest), EBSCO Discovery Service, Koha, Alma используют SRU для одновременного опроса десятков каталогов (локальный каталог, WorldCat, репозитории статей, цифровые архивы) и объединения результатов в единый интерфейс.

Национальные библиотеки и агрегаторы

  • Library of Congress (LOC) — эталонная реализация.
  • Deutsche Nationalbibliothek (DNB), BnF (Франция), РГБ / ГПНТБ (Россия) — предоставляют SRU-эндпоинты для доступа к библиографическим данным;
  • WorldCat (OCLC) — крупнейшая база данных библиографических записей мира, доступна через SRU (Web Services).

Научные репозитории и Open Access

Платформы DSpace, EPrints, Invenio (на базе которой работает CERN Zenodo) имеют встроенную поддержку SRU/OAI-PMH для сбора метаданных.

OSINT и Автоматизированный сбор данных

  • Ищут упоминания организаций/персон в библиотечных фондах и архивах.
  • Скачивают библиографические описания (MARC/Dublin Core) для построения графов связей.
  • Мониторят новые поступления по тематическим профилям (SDI — Selective Dissemination of Information).

Z39.50/SRU шлюзы (Gateways)

Существует программное обеспечение (например, YAZ Toolkit, Zebra от Index Data), которое позволяет «обернуть» любую SQL-базу данных или поисковый движок (Elasticsearch, Solr) в SRU-интерфейс, делая её доступной для стандартных библиотечных клиентов.


Инструменты для работы с SRU

Командная строка и утилиты

  • YAZ Client (yaz-client), стандарт де-факто для тестирования Z39.50/SRU серверов. Позволяет интерактивно посылать CQL запросы и смотреть сырые ответы.
  • cURL / HTTPie — для быстрых проверок GET-запросов.

Библиотеки для разработчиков

  • Python: pysru, yaz-python (биндинги к YAZ), requests + ручной парсинг XML (lxml).
  • Java: Z3950/JSRU, клиенты на базе Apache HttpClient.
  • Node.js: sru-client.
  • Go: go-sru.

Пример на Python (упрощенно)

import requests
from lxml import etree

url = "https://catalog.example.org/sru"
params = {
 "operation": "searchRetrieve",
 "version": "1.1",
 "query": 'dc.title all "python"',
 "maximumRecords": "5",
 "recordSchema": "dc"
}

response = requests.get(url, params=params)
root = etree.fromstring(response.content)

ns = {'srw': 'http://www.loc.gov/zing/srw/', 'dc': 'http://purl.org/dc/elements/1.1/'}

records = root.xpath('//srw:recordData/dc:title', namespaces=ns)

for title in records:
 print(title.text)

Операция Explain: Самоописание сервера

Перед тем как искать, умный клиент спрашивает у сервера: «Что ты умеешь?». Для этого используется операция explain.

Запрос: https://server/sru?operation=explain&version=1.1

В ответе (XML по схеме ZEEREEX) содержится:

  • Список поддерживаемых индексов поиска (названия, атрибуты, типы).
  • Поддерживаемые схемы записей (dc, marcxml, mods и т.д.).
  • Поддерживаемые операции (searchRetrieve, scan, sort).
  • Информацию о базе данных (название, описание, контакты администратора).
  • Ограничения (макс. записей, таймауты).

Это позволяет создавать универсальные клиенты, которые динамически подстраиваются под любой SRU-сервер без ручной настройки.


Перспективы: SRU 2.0, JSON и Linked Data

Стандарт не стоит на месте; Актуальная версия SRU 1.2 (и разрабатываемый SRU 2.0) вносит важные изменения:

  • JSON нативно: Параметр recordPacking=json и заголовок Accept: application/json позволяют получать записи в JSON, что критично для современных веб-приложений и мобильных клиентов.
  • CQL-JSON: Представление самого запроса в JSON вместо строки URL (для сложных POST-запросов).
  • Интеграция с Linked Data / RDF: Возможность отдачи записей в JSON-LD, Turtle, RDF/XML, что вписывает SRU в экосистему Semantic Web и Knowledge Graphs.
  • OpenSearch / SRU Mapping: Стандартизация моста между OpenSearch (используется в браузерах/сайтах) и SRU.

Резюме: Почему SRU упрощает жизнь профессионалам

SRU упрощает поиск информации не для обычного пользователя «за строками браузера», а для систем и инженеров, которые строят эти инструменты.

  1. Унификация: Один код клиента работает с тысячами каталогов по всему миру (LOC, WorldCat, национальные библиотеки, университетские репозитории).
  2. Точность: CQL позволяет искать строго по полям (автор, ISBN, год, предметная заголовок), исключая шум полнотекстового веб-поиска.
  3. Машинная читаемость: Структурированный XML/JSON с метаданными (MARC, Dublin Core) сразу идет в базу знаний, каталог или аналитическую систему без этапа «скрапинга и очистки».
  4. Надежность: Стандарт OASIS/ISO гарантирует обратную совместимость и стабильность интерфейса на десятилетия.
  5. Федеративность: Позволяет строить мета-поисковики (Discovery), опрашивающие гетерогенные источники в реальном времени.

SRU (Search/Retrieve via URL) — это «скрытый стандарт», обеспечивающий интероперабельность глобальной библиотечной и научной информационной инфраструктуры. Если вы разрабатываете систему для OSINT, библиометрический анализатор, агрегатор открытых данных или просто хотите программно получить качественные библиографические записи — SRU и язык CQL являются лучшим выбором, превосходящим по точности и структуре любые публичные веб-API поисковиков.

Понимание принципов SRU открывает доступ к огромным массивам структурированного знания, скрытым за интерфейсами каталогов библиотек, архивов и репозиториев по всему миру.


Полезные ссылки для углубленного изучения:

  • Официальная страница SRU в Library of Congress
  • Технический комитет OASIS SRU
  • Спецификация языка CQL (Contextual Query Language)
  • YAZ Toolkit, профессиональный инструментарий для Z39.50/SRU