API: сохраняйте то же соединение по запросу к базе данных в поисковой системе автозаполнения - PullRequest
0 голосов
/ 29 января 2020

Я делаю API (fastapi) с поиском по автозаполнению, использую эластичный поиск в фоновом режиме (elasticsearch-py и elasticsearch-async для асинхронных запросов). У меня есть рабочий прототип. На моей первой попытке я ввел соединение с помощью промежуточного программного обеспечения, это упрощенная конечная точка

router = APIRouter() 

@router.post("/search/")
async def search(
    search_text: str, connection: Elasticsearch = Depends(get_connection)  # noqa: B008,
):
    """ Stack overflow example """

    searcher = Searcher(connection)
    items = searcher.search_item(search_text)

    return items

Здесь get_connection пропускает соединение с запросом через промежуточное программное обеспечение. Searcher - это пользовательский класс с логикой поиска c. Это, очевидно, медленно, потому что для каждой клавиши, которую пользователь нажимает на панели поиска, теряется время при подключении кasticsearch, поэтому этот подход не подходит для автозаполнения в реальном времени.

Установка соединения на проект root, таким образом я сейчас использую поисковую систему

router = APIRouter() 

CONNECTION: Elasticsearch = MyOwnClassThatMakeConnection(**some_configuration)


@router.post("/search/")
async def search(
    search_text: str  # noqa: B008,
):
    """ Stack overflow example """

    searcher = Searcher(CONNECTION)
    items = searcher.search_item(search_text)

    return items

Это отлично работает, но я не уверен, я хочу эфемерное соединение, то есть, если пользователь вводит в строке поиска создайте соединение и поддерживайте его, пока пишете, и в конце уничтожьте его. Я думаю, что это невозможно, просто атаковать в спину, мне нужна помощь спереди! Я слышал о паутинах .

Если бы кто-то делал подобную поисковую систему, я был бы признателен за предложения.

...