✨ Major Features: - Complete RAG system for hotel website analysis - Hybrid audit with BGE-M3 embeddings + Natasha NER - Universal horizontal Excel reports with dashboards - Multi-region processing (SPb, Orel, Chukotka, Kamchatka) 📊 Completed Regions: - Орловская область: 100% (36/36) - Чукотский АО: 100% (4/4) - г. Санкт-Петербург: 93% (893/960) - Камчатский край: 87% (89/102) 🔧 Infrastructure: - PostgreSQL with pgvector extension - BGE-M3 embeddings API - Browserless for web scraping - N8N workflows for automation - S3/Nextcloud file storage 📝 Documentation: - Complete DB schemas - API documentation - Setup guides - Status reports
6.1 KiB
6.1 KiB
📊 Справка по структуре БД отелей
🔑 Основные таблицы и их ключевые поля
1. hotel_main - Основная таблица отелей
Первичный ключ: id (UUID) ⚠️ НЕ hotel_id!
Основные колонки:
id- UUID отеля (PRIMARY KEY)full_name- Полное названиеshort_name- Краткое названиеwebsite_address- ⚠️ НЕwebsite! Адрес сайтаphone- Телефонemail- Emailowner_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.idhotel_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,urlembedding- Вектор эмбеддинга (vector(1024))
5. hotel_website_meta - Метаданные сайтов
Основные колонки:
id- ID записиhotel_id- UUID отеляtotal_pages- Всего страницcrawled_pages- Скраулено страницlast_crawl_date- Дата последнего краулингаcrawl_status- Статус краулингаssl_valid- Валидность SSLtechnologies- Используемые технологии (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. Неправильные названия колонок:
# ❌ НЕПРАВИЛЬНО:
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. Уникальные индексы:
-- 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
📝 Примеры запросов
Получить отели с сайтами:
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 страницами:
SELECT hotel_id, COUNT(*) as page_count
FROM hotel_website_processed
GROUP BY hotel_id
HAVING COUNT(*) = 10 -- ровно 10 страниц
Статистика по краулингу:
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