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