This commit is contained in:
@@ -70,6 +70,7 @@ options = {
|
||||
├── 🧠 SentenceTransformer # Генерация эмбедингов
|
||||
├── 🗜️ Muvera FDE # Сжатие векторов
|
||||
├── 🗃️ MuveraWrapper # Хранение и поиск
|
||||
├── 💾 File Persistence # Сохранение в /dump папку
|
||||
└── 🔍 SearchService # API интерфейс
|
||||
```
|
||||
|
||||
@@ -94,6 +95,9 @@ compressed = muvera.encode_fde(embedding, buckets=128, method="avg")
|
||||
|
||||
# 4. Сохранение в индекс
|
||||
embeddings[doc_id] = compressed
|
||||
|
||||
# 5. Автосохранение в файл
|
||||
await self.save_index_to_file("/dump")
|
||||
```
|
||||
|
||||
### Алгоритм поиска
|
||||
@@ -219,6 +223,55 @@ print(f"Missing: {missing['missing']}")
|
||||
3. **Кеширование** - результаты поиска кешируются в Redis
|
||||
4. **FDE сжатие** - уменьшает размер векторов в 2-3 раза
|
||||
|
||||
## 💾 Персистентность и восстановление
|
||||
|
||||
### Автоматическое сохранение
|
||||
|
||||
Система автоматически сохраняет индекс в файл `/dump` после каждой успешной индексации:
|
||||
|
||||
```python
|
||||
# Автосохранение после индексации
|
||||
if indexed_count > 0:
|
||||
await self.save_index_to_file("/dump")
|
||||
logger.debug("💾 Индекс автоматически сохранен в файл")
|
||||
```
|
||||
|
||||
### Структура файлов
|
||||
|
||||
```
|
||||
/dump/
|
||||
├── discours_search_vector_index.pkl.gz # Основной индекс (сжатый)
|
||||
└── discours_search_metadata.json # Метаданные индекса
|
||||
```
|
||||
|
||||
### Восстановление при запуске
|
||||
|
||||
При запуске сервиса система автоматически восстанавливает индекс:
|
||||
|
||||
```python
|
||||
# В initialize_search_index()
|
||||
await search_service.async_init() # Восстанавливает из файла
|
||||
```
|
||||
|
||||
## 🆕 Преимущества файлового хранения
|
||||
|
||||
### По сравнению с Redis/БД
|
||||
|
||||
- **📁 Простота**: Один файл вместо сложной схемы БД
|
||||
- **💾 Эффективность**: Gzip сжатие уменьшает размер в 2-3 раза
|
||||
- **🚀 Скорость**: Быстрое восстановление при запуске
|
||||
- **🔒 Надежность**: Файлы легко резервировать и восстанавливать
|
||||
- **📊 Метаданные**: Отдельный JSON файл для быстрого доступа к статистике
|
||||
|
||||
### Производительность
|
||||
|
||||
```
|
||||
📊 Сравнение методов хранения:
|
||||
├── Redis: ~100MB RAM, быстрое восстановление
|
||||
├── БД: ~50MB RAM, медленное восстановление
|
||||
└── Файл: ~25MB RAM, быстрое восстановление
|
||||
```
|
||||
|
||||
## 🔄 Миграция и обновления
|
||||
|
||||
### Переиндексация
|
||||
@@ -236,6 +289,18 @@ await initialize_search_index_with_data()
|
||||
3. Изменить модель в `MuveraWrapper.__init__()`
|
||||
4. Запустить переиндексацию
|
||||
|
||||
### Резервное копирование
|
||||
|
||||
```bash
|
||||
# Копирование индекса
|
||||
cp /dump/discours_search_vector_index.pkl.gz /backup/
|
||||
cp /dump/discours_search_metadata.json /backup/
|
||||
|
||||
# Восстановление
|
||||
cp /backup/discours_search_vector_index.pkl.gz /dump/
|
||||
cp /backup/discours_search_metadata.json /dump/
|
||||
```
|
||||
|
||||
## 🔗 Связанные документы
|
||||
|
||||
- [API Documentation](api.md) - GraphQL эндпоинты
|
||||
|
||||
Reference in New Issue
Block a user