diff --git a/History/session-06-elements-json.md b/History/session-06-elements-json.md new file mode 100644 index 0000000..858866a --- /dev/null +++ b/History/session-06-elements-json.md @@ -0,0 +1,46 @@ +# Сессия #6 — elements_json, структура документа в БД + +_Дата: 2026-06-17_ +_Версия: v1.12_ + +--- + +## Контекст + +После отладки парсинга выяснилось: `parsed_text` хранит плоский текст (таблицы слиты через `--- Таблица ---`), структура теряется. Для сравнения договоров нужна полная структура: где параграф, где таблица, какие стили, номера страниц. + +## Решение + +### schema.py +- `documents.elements_json JSONB` — новая колонка +- `ALTER TABLE ADD COLUMN IF NOT EXISTS` — миграция для существующих таблиц + +### parser.py +- PDF: каждый `element` теперь содержит `"page": N` (номер страницы из pdfplumber) + +### app.py +- `_parse`: `db.execute("... SET parsed_text=%s, elements_json=%s ...")` — сохраняется `json.dumps(elements)` + +## Формат elements_json + +```json +[ + {"type":"paragraph","style":"Heading 1","text":"Спецификация"}, + {"type":"table","rows":[["Услуга","Цена"],["Хостинг","1000"]],"page":1}, + {"type":"paragraph","style":"Normal","text":"Итого:","page":1} +] +``` + +Для PDF: `page`, `style`="" (pdfplumber не даёт стилей). +Для DOCX: `style` из Word, `page` нет (но есть разрывы страниц в XML — не извлечены пока). + +## Что это даёт + +| Запрос | SQL | +|---|---| +| Все таблицы документа | `jsonb_array_elements(elements_json) WHERE value->>'type'='table'` | +| Ячейка [2][3] таблицы 1 | `elements_json->0->'rows'->2->3` | +| Всё со страницы 5 | `WHERE value->>'page'='5'` | +| Все Heading | `WHERE value->>'style' LIKE 'Heading%'` | + +`parsed_text` сохранён для LLM/полнотекстового поиска.