This commit is contained in:
@@ -70,6 +70,7 @@ options = {
|
|||||||
├── 🧠 SentenceTransformer # Генерация эмбедингов
|
├── 🧠 SentenceTransformer # Генерация эмбедингов
|
||||||
├── 🗜️ Muvera FDE # Сжатие векторов
|
├── 🗜️ Muvera FDE # Сжатие векторов
|
||||||
├── 🗃️ MuveraWrapper # Хранение и поиск
|
├── 🗃️ MuveraWrapper # Хранение и поиск
|
||||||
|
├── 💾 File Persistence # Сохранение в /dump папку
|
||||||
└── 🔍 SearchService # API интерфейс
|
└── 🔍 SearchService # API интерфейс
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -94,6 +95,9 @@ compressed = muvera.encode_fde(embedding, buckets=128, method="avg")
|
|||||||
|
|
||||||
# 4. Сохранение в индекс
|
# 4. Сохранение в индекс
|
||||||
embeddings[doc_id] = compressed
|
embeddings[doc_id] = compressed
|
||||||
|
|
||||||
|
# 5. Автосохранение в файл
|
||||||
|
await self.save_index_to_file("/dump")
|
||||||
```
|
```
|
||||||
|
|
||||||
### Алгоритм поиска
|
### Алгоритм поиска
|
||||||
@@ -219,6 +223,55 @@ print(f"Missing: {missing['missing']}")
|
|||||||
3. **Кеширование** - результаты поиска кешируются в Redis
|
3. **Кеширование** - результаты поиска кешируются в Redis
|
||||||
4. **FDE сжатие** - уменьшает размер векторов в 2-3 раза
|
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__()`
|
3. Изменить модель в `MuveraWrapper.__init__()`
|
||||||
4. Запустить переиндексацию
|
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 эндпоинты
|
- [API Documentation](api.md) - GraphQL эндпоинты
|
||||||
|
|||||||
Reference in New Issue
Block a user