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