Реализация поиска по лекциям на 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 или внешние движки. Главное - правильно подготовить данные и протестировать производительность. Надеемся, наши советы помогут вам успешно реализовать поиск и улучшить пользовательский опыт на сайте.

    Часто задаваемые вопросы