Проект аудита отелей: основные скрипты и документация

- Краулеры: smart_crawler.py, regional_crawler.py
- Аудит: audit_orel_to_excel.py, audit_chukotka_to_excel.py
- РКН проверка: check_rkn_registry.py, recheck_unclear_rkn.py
- Отчёты: create_orel_horizontal_report.py
- Обработка: process_all_hotels_embeddings.py
- Документация: README.md, DB_SCHEMA_REFERENCE.md
This commit is contained in:
Фёдор
2025-10-16 10:52:09 +03:00
parent 545e199389
commit 0cf3297290
105 changed files with 28743 additions and 0 deletions

182
DB_SCHEMA_REFERENCE.md Normal file
View File

@@ -0,0 +1,182 @@
# 📊 Справка по структуре БД отелей
## 🔑 Основные таблицы и их ключевые поля
### 1. `hotel_main` - Основная таблица отелей
**Первичный ключ:** `id` (UUID) ⚠️ **НЕ `hotel_id`!**
**Основные колонки:**
- `id` - UUID отеля (PRIMARY KEY)
- `full_name` - Полное название
- `short_name` - Краткое название
- `website_address` - ⚠️ **НЕ `website`!** Адрес сайта
- `phone` - Телефон
- `email` - Email
- `owner_full_name` - ФИО владельца
- `owner_ogrn` - ОГРН
- `owner_inn` - ИНН
- `region_id`, `region_name` - Регион
- `category_id`, `category_name` - Категория (звёзды)
- `hotel_type_id`, `hotel_type_name` - Тип отеля
- `status_id`, `status_name` - Статус
- `website_status` - Статус сайта
- `rkn_registry_status`, `rkn_registry_number`, `rkn_registry_date` - РКН
- `created_at`, `updated_at` - Даты создания/обновления
### 2. `hotel_website_raw` - Сырые данные с сайтов
**Связь:** `hotel_id``hotel_main.id`
**Основные колонки:**
- `id` - ID записи
- `hotel_id` - UUID отеля (FK к hotel_main.id)
- `url` - URL страницы
- `html` - ⚠️ **НЕ `raw_html`!** HTML контент
- `status_code` - ⚠️ **НЕ `http_status`!** HTTP код
- `crawled_at` - Дата краулинга
- `content_hash` - Хеш контента
- `response_time` - Время ответа
**Уникальный индекс:** `(hotel_id, url)`
### 3. `hotel_website_processed` - Обработанные данные
**Связь:** `hotel_id``hotel_main.id`, `raw_page_id``hotel_website_raw.id`
**Основные колонки:**
- `id` - ID записи
- `raw_page_id` - FK к hotel_website_raw.id
- `hotel_id` - UUID отеля (FK к hotel_main.id)
- `url` - URL страницы
- `cleaned_text` - Очищенный текст
- `text_length` - Длина текста
- `extracted_data` - Извлечённые данные (JSON)
- `has_forms` - Наличие форм
- `has_booking` - Наличие бронирования
- `processed_at` - ⚠️ **НЕ `created_at`!** Дата обработки
**Уникальный индекс:** `(hotel_id, url)`
### 4. `hotel_website_chunks` - Чанки для векторного поиска
**Основные колонки:**
- `id` - ID записи
- `hotel_id` - UUID отеля
- `text` - Текст чанка
- `metadata` - Метаданные (JSON): `hotel_id`, `hotel_name`, `region_name`, `url`
- `embedding` - Вектор эмбеддинга (vector(1024))
### 5. `hotel_website_meta` - Метаданные сайтов
**Основные колонки:**
- `id` - ID записи
- `hotel_id` - UUID отеля
- `total_pages` - Всего страниц
- `crawled_pages` - Скраулено страниц
- `last_crawl_date` - Дата последнего краулинга
- `crawl_status` - Статус краулинга
- `ssl_valid` - Валидность SSL
- `technologies` - Используемые технологии (JSON)
### 6. `hotel_audit_results` - Результаты аудита
**Основные колонки:**
- `id` - ID записи
- `hotel_id` - UUID отеля
- `audit_date` - Дата аудита
- `criterion_id` - ID критерия
- `criterion_name` - Название критерия
- `status` - Статус проверки
- `score` - Оценка
- `details` - Детали (JSON)
- `evidence_urls` - URL доказательств
- `evidence_quotes` - Цитаты доказательств
### 7. `hotel_additional_info` - Дополнительная информация
### 8. `hotel_rooms` - Номера отелей
### 9. `hotel_services` - Услуги отелей
### 10. `hotel_sanatorium` - Санатории
### 11. `hotel_raw_json` - Сырые JSON данные
### 12. `hotel_parsing_progress` - Прогресс парсинга
---
## ⚠️ ЧАСТЫЕ ОШИБКИ И ИСПРАВЛЕНИЯ
### 1. Неправильные названия колонок:
```python
# ❌ НЕПРАВИЛЬНО:
JOIN hotel_main m ON p.hotel_id = m.hotel_id
SELECT website FROM hotel_main
SELECT raw_html FROM hotel_website_raw
SELECT http_status FROM hotel_website_raw
WHERE created_at > ... # для hotel_website_processed
# ✅ ПРАВИЛЬНО:
JOIN hotel_main m ON p.hotel_id = m.id
SELECT website_address FROM hotel_main
SELECT html FROM hotel_website_raw
SELECT status_code FROM hotel_website_raw
WHERE processed_at > ... # для hotel_website_processed
```
### 2. Уникальные индексы:
```sql
-- hotel_website_raw
ON CONFLICT (hotel_id, url) DO UPDATE ...
-- hotel_website_processed
ON CONFLICT (hotel_id, url) DO UPDATE ...
```
### 3. Связи таблиц:
```
hotel_main.id (UUID)
hotel_website_raw.hotel_id → hotel_website_raw.id
↓ ↓
hotel_website_processed.hotel_id + raw_page_id
hotel_website_chunks.hotel_id
```
---
## 📝 Примеры запросов
### Получить отели с сайтами:
```sql
SELECT m.id, m.full_name, m.website_address, COUNT(p.*) as pages_count
FROM hotel_main m
LEFT JOIN hotel_website_processed p ON p.hotel_id = m.id
WHERE m.website_address IS NOT NULL
GROUP BY m.id, m.full_name, m.website_address
```
### Найти отели с N страницами:
```sql
SELECT hotel_id, COUNT(*) as page_count
FROM hotel_website_processed
GROUP BY hotel_id
HAVING COUNT(*) = 10 -- ровно 10 страниц
```
### Статистика по краулингу:
```sql
SELECT
COUNT(DISTINCT hotel_id) as total_hotels,
COUNT(*) as total_pages,
AVG(text_length) as avg_text_length
FROM hotel_website_processed
WHERE processed_at > NOW() - INTERVAL '24 hours'
```
---
## 🔍 Полная схема
См. файл `db_schema_hotels.json` для детальной информации обо всех колонках.
---
**Дата создания:** 2025-10-14
**Автор:** Фёдор + AI Assistant