fix(parsers): починить CyberLeninka + подготовить русскую заливку корпуса
Корпус на 99.4% английский, 0 русских источников — при том что сервис для русских студентов. Корень: парсер CyberLeninka был сломан (слал GET на /api/search → HTTP 405) и ни разу не наполнял базу. - cyberleninka.py: GET→POST с JSON-телом (mode=articles); authors теперь из списка (API отдаёт список, не строку); чистка <b>-подсветки и HTML-сущностей ("). Проверено вживую: 5/5 студенческих тем возвращают реальные русские статьи. - Юнит-тесты парсера (scripts/parsers/tests/, 5 шт.) + обвязка; run_tests.sh обобщён на пути → парсеры теперь в тест-гейте CI. Всего тестов: 87. - scripts/seed_ru_sources.py: сидер parse_sources по 30 студенческим дисциплинам (dry-run по умолчанию, --apply для записи). НЕ запускает заливку — готовит задания. - docs/INGESTION.md: runbook (текущее состояние, шаги запуска, проверка, масштаб). Прод-путь index.run_parser уже поддерживает cyberleninka и openalex(lang=ru). Заливку не запускал — это отдельный go (ресурсоёмко: GPU-эмбеддинги, рост БД). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
52
docs/INGESTION.md
Normal file
52
docs/INGESTION.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# Наполнение корпуса — runbook
|
||||
|
||||
## Текущее состояние (на 2026-08-12)
|
||||
|
||||
- ~**42K документов**, из них **99.4% английские, 0 русских** (см. `documents`).
|
||||
- Заливка **встала 2026-08-07**. Корпус — seed из ~30 английских тем OpenAlex/arXiv.
|
||||
- Для сервиса под русских студентов это главный дефект: русские работы проверять
|
||||
не с чем.
|
||||
|
||||
## Что подготовлено
|
||||
|
||||
- **Парсер CyberLeninka починен** (`scripts/parsers/cyberleninka.py`): раньше слал GET
|
||||
на `/api/search` → HTTP 405; теперь POST с JSON-телом (`mode=articles`), authors из
|
||||
списка, чистка `<b>`/HTML-сущностей. Проверено вживую (5/5 тем) + юнит-тесты
|
||||
(`scripts/parsers/tests/`), в гейте CI.
|
||||
- **Прод-путь готов**: `index.run_parser(source_id)` уже умеет `cyberleninka` и
|
||||
`openalex` c `lang=ru`.
|
||||
- **Сидер источников**: `scripts/seed_ru_sources.py` — 30 студенческих дисциплин.
|
||||
|
||||
## Запуск русской заливки
|
||||
|
||||
```bash
|
||||
# 1. (на app-хосте / в контейнере worker-indexer, где есть psycopg2 и прод-.env)
|
||||
# Посмотреть план:
|
||||
python scripts/seed_ru_sources.py
|
||||
# Создать источники в parse_sources (лимит на дисциплину):
|
||||
python scripts/seed_ru_sources.py --apply --limit 500
|
||||
|
||||
# 2. Проверить пару источников на темпе/качестве, затем запустить заливку:
|
||||
# • Админ-панель → «Источники» → «Запустить», ЛИБО
|
||||
# • Celery: index.run_parser.delay(source_id) по каждому id
|
||||
```
|
||||
|
||||
Заливка сама: fetch (rate-limit 1 req/s) → `add_document` (дедуп по `ext_id`,
|
||||
fingerprints L1, MinHash L2) → батч-эмбеддинги `gpu.embed_documents` (L3). ~30 тем ×
|
||||
500 ≈ 15K русских документов на первый заход.
|
||||
|
||||
## Проверка результата
|
||||
|
||||
```sql
|
||||
SELECT lang, count(*) FROM documents GROUP BY lang ORDER BY 2 DESC; -- должен появиться ru
|
||||
SELECT source, count(*) FROM documents WHERE source='cyberleninka'; -- > 0
|
||||
```
|
||||
|
||||
## Масштаб (следующий уровень)
|
||||
|
||||
- Больше тем + выше `--limit`; добавить OpenAlex `lang=ru` (качество ниже — англ.
|
||||
заголовки с меткой ru).
|
||||
- Для миллионов — **bulk** (снапшот OpenAlex на S3), а не постраничный API.
|
||||
- На масштабе обязателен `VECTOR_BACKEND=qdrant` (FAISS flat не тянет), а таблица
|
||||
`fingerprints` (уже ~29M строк на 42K доков) потребует партиционирования. См.
|
||||
[ARCHITECTURE.md](ARCHITECTURE.md) и [DR-HA.md](DR-HA.md).
|
||||
Reference in New Issue
Block a user