Реализация поиска по лекциям на FastAPI с конвертером MD в HTML
Создание сайта-сборника лекций с конвертацией Markdown в HTML - удобный способ структурировать учебные материалы. Однако добавление функции поиска по тексту лекций может вызвать вопросы. В этой статье мы разберём, как реализовать эффективный поиск на бэкенде FastAPI, используя простые и проверенные алгоритмы.
Основные подходы к организации поиска
Для поиска по содержимому лекций можно использовать несколько методов, от простого перебора до полнотекстового индексирования. Выбор зависит от объёма данных и требований к скорости.
1. Линейный поиск с помощью Python
Самый простой способ - загрузить все HTML-файлы (полученные из MD) и проверять наличие искомого слова в каждой строке. Для этого подойдёт функция str.find() или регулярные выражения re.search(). Пример:
import os
def search_lectures(query):
results = []
for filename in os.listdir('lectures/'):
with open(f'lectures/{filename}', 'r') as f:
content = f.read()
if query.lower() in content.lower():
results.append(filename)
return resultsЭтот подход прост, но медленный при большом количестве файлов. Он подходит для прототипа или небольшого сайта.
2. Полнотекстовый поиск с SQLite FTS5
Если вы храните метаданные лекций в базе данных, используйте встроенную возможность SQLite - модуль FTS5 (Full-Text Search). Он создаёт индекс по тексту и позволяет выполнять быстрые запросы. Пример настройки в FastAPI:
from fastapi import FastAPI
import sqlite3
app = FastAPI()
conn = sqlite3.connect('lectures.db')
conn.execute('CREATE VIRTUAL TABLE IF NOT EXISTS lectures_fts USING fts5(title, content)')
@app.get('/search')
async def search(q: str):
cursor = conn.execute('SELECT title, content FROM lectures_fts WHERE content MATCH ?', (q,))
return cursor.fetchall()FTS5 поддерживает поиск по фразам, префиксам и ранжирование результатов. Это отличный выбор для средних проектов.
3. Использование внешних поисковых движков
Для масштабируемых решений рассмотрите Elasticsearch или MeiliSearch. Они предоставляют REST API, легко интегрируются с FastAPI через клиентские библиотеки (например, elasticsearch-py).
Практические рекомендации по реализации
При разработке поиска по лекциям учитывайте следующие моменты:
- Индексируйте только значимый контент: исключите HTML-теги, скрипты и стили. Используйте библиотеку
beautifulsoup4илиmarkdownдля извлечения чистого текста. - Нормализуйте запрос: приводите поисковый запрос и текст к нижнему регистру, удаляйте лишние пробелы и знаки препинания.
- Реализуйте пагинацию: не выводите все результаты сразу - используйте параметры
limitиoffset. - Добавьте подсветку найденных слов: используйте
re.sub()для оборачивания совпадений в тег<mark>.
Полезные ресурсы для изучения
Чтобы углубиться в тему, рекомендуем:
- Документацию FastAPI: https://fastapi.tiangolo.com/ - раздел про работу с базами данных.
- Официальную документацию SQLite FTS5: https://www.sqlite.org/fts5.html - примеры синтаксиса.
- Видео-курсы на YouTube: поищите «Full-Text Search FastAPI» - много практических уроков.
- Статьи на Habr и Dev.to: «Реализация поиска на Python» - разбор алгоритмов.
Заключение
Добавление функции поиска по лекциям на FastAPI - задача, решаемая несколькими способами. Для старта подойдёт линейный поиск, для продакшена - FTS5 или внешние движки. Главное - правильно подготовить данные и протестировать производительность. Надеемся, наши советы помогут вам успешно реализовать поиск и улучшить пользовательский опыт на сайте.