Этот проект представляет собой веб-приложение для поиска фильмов, использующее Elasticsearch для индексации и поиска данных. Приложение также взаимодействует с базой данных SQLite для хранения информации о фильмах, пользователях и комментариях.
project/
├── main.py # Основной файл приложения (FastAPI)
├── elasticsearch_utils.py # Утилиты для работы с Elasticsearch
├── transformer_utils.py # Генерация эмбеддингов с помощью модели Transformers
├── models.py # Модели данных Pydantic
├── templates/ # HTML-шаблоны для интерфейса
│ ├── index.html # Главная страница
│ ├── search.html # Страница результатов поиска
├── data/ # Данные для индексации
│ └── movies_metadata.csv.zip # CSV-файл с информацией о фильмах
├── config/ # Конфигурационные файлы
│ └── elasticsearch.yml # Настройки Elasticsearch
└── movies.db # SQLite база данных
- Убедитесь, что установлен Python 3.9+
- Установите зависимости из файла
requirements.txt:pip install -r requirements.txt
- Скачайте Elasticsearch.
- Распакуйте архив.
- Запустите Elasticsearch командой:
bin\elasticsearch.bat - Проверьте, что Elasticsearch работает, открыв в браузере:
http://localhost:9200
Для создания структуры базы данных выполните команду:
python main.py init_dbДля запуска приложения выполните:
python main.py startПриложение будет доступно по адресу:
http://127.0.0.1:8000
- Откройте главную страницу приложения:
http://127.0.0.1:8000 - Используйте строку поиска для ввода запроса. Выберите тип индексации:
- tfidf: поиск по TF-IDF вектору.
- embeddings: поиск по эмбеддингам, созданным с помощью модели Transformers.
- Нажмите кнопку поиска, чтобы увидеть результаты.
Скрипт main.py поддерживает следующие команды:
-
start: Запуск веб-сервера.
python main.py start
-
init_db: Инициализация базы данных SQLite.
python main.py init_db
users:
- user_id (INTEGER, PK)
- username (TEXT)
- password (TEXT)
- email (TEXT)
movies:
- movie_id (INTEGER, PK)
- title (TEXT)
- overview (TEXT)
- release_date (TEXT)
- embedding (TEXT)
comments:
- comment_id (INTEGER, PK)
- movie_id (INTEGER, FK -> movies.movie_id)
- user_id (INTEGER, FK -> users.user_id)
- comment (TEXT)
- created_at (DATETIME)
Основной файл приложения. Реализует следующие функции:
- Запуск веб-сервера с использованием FastAPI.
- Маршруты:
GET /: Главная страница.POST /search: Обработка запросов на поиск.
- Инициализация базы данных SQLite (таблицы для фильмов, пользователей, комментариев).
- Создание клиента Elasticsearch.
- Индексация данных о фильмах в Elasticsearch (TF-IDF и эмбеддинги).
- Реализация функции поиска по двум индексам:
- movies_tfidf
- movies_embeddings
- Использование модели
sentence-transformers/all-MiniLM-L6-v2для генерации эмбеддингов текста. - Функция
get_embedding(text)возвращает векторное представление строки текста.
- Определяет модели данных с использованием Pydantic:
SearchRequest: запрос на поиск.SearchResult: результат поиска.
- index.html: Форма поиска.
- search.html: Вывод результатов поиска.
Для загрузки данных из файла movies_metadata.csv в Elasticsearch используйте функцию insert_data_to_elasticsearch() из файла elasticsearch_utils.py.
Пример использования:
from elasticsearch_utils import insert_data_to_elasticsearch
insert_data_to_elasticsearch()В таблицу movies можно добавлять данные вручную или через Python-скрипт, используя библиотеку sqlite3.
Пример:
import sqlite3
conn = sqlite3.connect('movies.db')
cursor = conn.cursor()
cursor.execute("INSERT INTO movies (title, overview) VALUES (?, ?)", ("Movie Title", "Movie Overview"))
conn.commit()
conn.close()Пример запроса с использованием Postman или cURL:
{
"query": "space adventure",
"index_type": "tfidf"
}[
{
"title": "Interstellar",
"overview": "A team of explorers travel through a wormhole in space.",
"score": 1.23
},
{
"title": "Gravity",
"overview": "Two astronauts work together to survive after an accident.",
"score": 1.12
}
]