Розробка харвестера

Зміни функціоналу 14.08.2026

Розділ 1

Головна сторінка тепер розповідає про масштаб репозиторію

Раніше головна сторінка обмежувалась пошуковим рядком і списком міжнародних агрегаторів. Тепер вона одразу показує, наскільки живий і великий репозиторій — трьома живими числами, двома графіками активності по роках і повністю переробленим списком мов.

Три живі числа замість статичного тексту

Спочатку тут був фіксований текст на кшталт «186 млн публікацій у світі» — загальна, нічим не підтверджена статистика. Замінили на три показники, які рахуються напряму з Solr-індексу при кожному завантаженні сторінки:

Три живі показники на головній сторінці: проіндексовані ресурси, джерела, повнотекстові документи
Головна сторінка — секція з живими показниками репозиторію

Графіки активності по роках

Додано два графіки: кількість «активних авторів» (тих, хто публікувався за поточний або попередній рік) і кількість ресурсів по роках. Дані рахуються окремим фоновим скриптом (важкий Solr-запит, тому не на кожен запит сторінки) і кешуються.

Перша версія була стовпчиковою діаграмою — і на реальному масштабі (репозиторій охоплює публікації з 1926 по 2026 рік) підписи років накладались одне на одне й ставали нечитабельними. Графік переробили на лінійний: підписи років показуються рідше й без накладання, точне значення для будь-якого року з'являється у підказці при наведенні миші, а сам графік завжди розтягується на всю ширину сторінки — без горизонтальної прокрутки, скільки б років не було в даних.

Список мов зі счиками ресурсів, відсортований за спаданням, і графік активності авторів по роках
Головна сторінка — фасет «Мова» та графік активності авторів

Список мов: сортування за кількістю, а не за алфавітом

Фасет «Мова» на головній сторінці показував мови за алфавітом і без чисел. Тепер він відсортований за кількістю ресурсів (найпопулярніші мови — вгорі) і показує кількість поруч із кожною мовою, тож одразу видно, наскільки переважає українська.

Новий агрегатор і повернений текст на кнопках

До списку міжнародних агрегаторів додано Google Scholar. Заразом виправлено давню візуальну ваду: напис «Сторінка репозиторію» на кнопках не вміщався та обрізався — причина виявилась у глобальному CSS-правилі, яке фіксувало висоту всіх кнопок сайту під висоту поля пошуку. Кнопки тепер самі підбирають потрібну висоту під текст.

Список агрегаторів разом з Google Scholar та футер на всю ширину екрана зі статистикою
Список агрегаторів (з Google Scholar) та футер сайту

Футер: колір хедера й статистика індексації

Фон футера пофарбовано в той самий колір, що й хедер сайту, розтягнуто на всю ширину екрана (незалежно від ширини основного контенту), і додано короткий блок статистики: загальна кількість ресурсів, дата останньої індексації та скільки ресурсів додано з того часу.


Розділ 2

Якість метаданих і повнотекстовий конвеєр

Значна частина роботи за ці два місяці — не в тому, що видно на сторінці, а в тому, наскільки коректні дані під нею: ключові слова, мова запису, автори.

Ключові слова: прибрано дублікати відмінків і сміттєві фрази

Індекс ключових слів для пошукового MCP-сервера (keyword_index.pkl) містив багато дублікатів — те саме поняття у формі однини й множини («потік» / «потоків»), або у родовому відмінку («композиція вебсервісу» / «композиція вебсервісів»). Провели кілька проходів очищення морфологічним аналізатором (pymorphy3):

Індекс скоротився з 47 949 до 45 330 ключових слів — без утрати реальних термінів.

Відоме обмеження

Для окремих статей полі language у Solr не збігається з мовою, задекларованою в XML-джерелі (наприклад, показує рідкісний код ia замість «English»). Причина: мова визначається не з XML, а автоматично за текстом самого PDF — бо OJS у dc:language перелічує всі мови анотації статті, а не мову конкретного файлу. Якщо витягнутий з PDF текст пошкоджений (частий випадок для статей з великою кількістю формул), детектор мови може помилитися. Виправлення (запобіжник, що повертається до значення з XML при низькій впевненості) поки не впроваджено.

Ключові слова тепер підбирає власний MCP-сервер

Конвеєр повнотекстового харвестингу (FullTextExtractor) під час індексації звертається до окремого сервера підбору ключових слів через протокол MCP (llm/mcp-keywords-server/, підключений у fulltext.ini) — той самий сервіс, який раніше розробляли й навчали окремо, тепер працює як частина продакшн-конвеєра харвестингу, а не лише як інструмент для локальної розробки.


Розділ 3

Новий спосіб підключити ШІ-агента до харвестера

Додано власний сервер за протоколом MCP (Model Context Protocol) — стандартом, яким користуються AI-асистенти (Claude та інші) для виклику інструментів у зовнішніх системах. На відміну від раніше створеного окремого Python-сервісу для підбору ключових слів, цей новий сервер написаний як звичайний модуль VuFind на PHP і працює прямо всередині сайту, використовуючи ті самі внутрішні сервіси пошуку, що й веб-інтерфейс.

Він дає ШІ-агенту два інструменти:

Підключення: claude mcp add --transport http harvester https://harvester.nas.gov.ua/Mcp


Розділ 4

Відстеження завантажень PDF

Клік по PDF-посиланню на сторінці запису тепер надсилає в Matomo дві події: іменовану подію «Download / PDF / назва статті» (для аналітики по конкретних статтях) і стандартний запис у звіт Matomo «Завантаження» — для випадків, коли посилання на файл не закінчується на .pdf і автоматичне відстеження Matomo не спрацювало б саме.


Розділ 5

Записи: афіліації авторів

На сторінці запису під списком авторів тепер показується рядок «Автори та афіліації» — інституція кожного автора поруч з його іменем, замість лише переліку прізвищ.

Сторінка запису з рядком афіліацій авторів і посиланням на завантаження PDF
Сторінка окремого запису — афіліації авторів та посилання на PDF
Заразом полагоджено

Блок «Про автора» з короткою довідкою з Вікіпедії (з'являється на сторінках пошуку за автором) перестав працювати, бо Вікіпедія прибрала підтримку старого формату відповіді API, яким користувався код. Перемкнули на сучасний формат — блок знову показує довідку.


Розділ 6

Обмін даними з іншими системами: OAI-PMH тепер передає журнал і сторінки

Харвестер сам віддає свої записи іншим системам (OpenAIRE, BASE тощо) через протокол OAI-PMH. У метаданих, які він для цього формує, тепер є не лише сама стаття, а й пов'язаний з нею запис журналу — назва, ISSN, том, випуск, перша й остання сторінки. Раніше зовнішні системи бачили статтю окремо від журналу, в якому вона опублікована; тепер зв'язок явний.


Розділ 7

Нові джерела й інфраструктура

Нове джерело: arheologia.com.ua

Підключено харвестинг журналу arheologia.com.ua через OAI-PMH. Заразом, під час цієї ж роботи, полагоджено два вже наявні джерела, які тихо не працювали: застаріле посилання для UkrainianJournalofPhysics та помилку в регулярному виразі, за яким для www-cpts-com-ua розпізнавався ідентифікатор запису.

Продакшн-сервіс для підбору ключових слів

MCP-сервер підбору ключових слів (розділ 2) отримав власний опис сервісу в продакшн-конфігурації Docker (docker-compose.prod.yml) — тепер він піднімається як окремий контейнер на продакшн-сервері так само надійно, як і решта сервісів харвестера.

Прибирання старих напрацювань

Каталог llm/ накопичив багато проміжних експериментів під час розробки підбору ключових слів — чорнові скрипти, датасети, ноутбуки в декількох ітераціях каталогів (1Keyword_extraction/delete/ тощо). Прибрано близько 29 700 рядків такого коду; робоча функціональність лишилась зібраною у двох місцях — llm/mcp-keywords-server/ (продакшн-сервер) і llm/4final/ (пайплайн навчання моделі).