From fef231e992135e257d49706707c0404413a5451f Mon Sep 17 00:00:00 2001 From: Markov Andrey Date: Tue, 30 Jun 2026 22:43:12 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20postgres=5Fservice.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rag/services/postgres_service.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/rag/services/postgres_service.py b/rag/services/postgres_service.py index cd55b94..aaebab1 100644 --- a/rag/services/postgres_service.py +++ b/rag/services/postgres_service.py @@ -1,10 +1,11 @@ -# -*- coding: utf-8 -*- +# rag/services/postgres_service.py """ Сервис для работы с PostgreSQL (через asyncpg). Обеспечивает пул соединений, CRUD операции для документов, истории диалогов, комнат MUC, управление доступом к личным документам. Добавлена поддержка флага indexed для транзакционности индексации. +Добавлены составные индексы для ускорения полнотекстового поиска (fallback). ВНИМАНИЕ: Создание таблиц теперь выполняется через Alembic, а не в коде. """ @@ -109,10 +110,15 @@ class PostgresService: indexed BOOLEAN DEFAULT FALSE ) """) + # Индексы await conn.execute("CREATE INDEX IF NOT EXISTS idx_documents_owner ON documents(owner_jid)") await conn.execute("CREATE INDEX IF NOT EXISTS idx_documents_global ON documents(is_global)") await conn.execute("CREATE INDEX IF NOT EXISTS idx_documents_room ON documents(room_jid)") await conn.execute("CREATE INDEX IF NOT EXISTS idx_documents_indexed ON documents(indexed)") + # Составные индексы для ускорения полнотекстового поиска (fallback) + await conn.execute("CREATE INDEX IF NOT EXISTS idx_documents_room_source ON documents(room_jid, source_name)") + await conn.execute("CREATE INDEX IF NOT EXISTS idx_documents_owner_source ON documents(owner_jid, source_name)") + # Полнотекстовый индекс (GIN) – используем 'russian', при необходимости заменить на 'simple' await conn.execute(""" CREATE INDEX IF NOT EXISTS ft_source_name ON documents USING GIN (to_tsvector('russian', source_name)) @@ -312,6 +318,7 @@ class PostgresService: """ Поиск по source_name с использованием полнотекстового индекса PostgreSQL. Возвращает список документов (id, source_name, metadata) только с indexed = TRUE. + Для ускорения используются составные индексы (room_jid, source_name) и (owner_jid, source_name). """ if not query or len(query.strip()) < 3: return []