session-06: elements_json JSONB, PDF page, структура в БД
This commit is contained in:
@@ -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/полнотекстового поиска.
|
||||
Reference in New Issue
Block a user