# Сессия #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/полнотекстового поиска.