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

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