Files
contracts/History/session-06-elements-json.md
T

47 lines
2.0 KiB
Markdown

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