saerch-fail-toler
All checks were successful
Deploy on push / deploy (push) Successful in 6s

This commit is contained in:
Untone 2024-11-22 20:32:14 +03:00
parent 9dde136c9c
commit a71a6fcc41

View File

@ -54,6 +54,9 @@ expected_mapping = index_settings["mappings"]
# Создание цикла событий # Создание цикла событий
search_loop = asyncio.get_event_loop() search_loop = asyncio.get_event_loop()
# В начале файла добавим флаг
SEARCH_ENABLED = bool(os.environ.get("ELASTIC_HOST", ""))
def get_indices_stats(): def get_indices_stats():
indices_stats = search_service.client.cat.indices(format="json") indices_stats = search_service.client.cat.indices(format="json")
@ -87,8 +90,8 @@ class SearchService:
self.client = None self.client = None
self.lock = asyncio.Lock() self.lock = asyncio.Lock()
# Инициализация клиента OpenSearch # Инициализация клиента OpenSearch только если поиск включен
if ELASTIC_HOST: if SEARCH_ENABLED:
try: try:
self.client = OpenSearch( self.client = OpenSearch(
hosts=[{"host": ELASTIC_HOST, "port": ELASTIC_PORT}], hosts=[{"host": ELASTIC_HOST, "port": ELASTIC_PORT}],
@ -98,25 +101,24 @@ class SearchService:
verify_certs=False, verify_certs=False,
ssl_assert_hostname=False, ssl_assert_hostname=False,
ssl_show_warn=False, ssl_show_warn=False,
# ca_certs = ca_certs_path
) )
logger.info("Клиент OpenSearch.org подключен") logger.info("Клиент OpenSearch.org подключен")
# Создание задачи и запуск в цикле событий
search_loop.create_task(self.check_index()) search_loop.create_task(self.check_index())
except Exception as exc: except Exception as exc:
logger.error(f"Ошибка подключения к OpenSearch: {exc}") logger.warning(f"Поиск отключен из-за ошибки подключения: {exc}")
self.client = None self.client = None
else: else:
logger.warning("env var ELASTIC_HOST is not set") logger.info("Поиск отключен (ELASTIC_HOST не установлен)")
async def info(self): async def info(self):
if not SEARCH_ENABLED:
return {"status": "disabled"}
try: try:
return get_indices_stats() return get_indices_stats()
except ConnectionError as e: except Exception as e:
logger.error(f"Failed to connect to OpenSearch: {e}") logger.error(f"Failed to get search info: {e}")
# Возможно стоит добавить fallback поведение return {"status": "error", "message": str(e)}
return
def delete_index(self): def delete_index(self):
if self.client: if self.client:
@ -154,6 +156,9 @@ class SearchService:
logger.error("клиент не инициализован, невозможно проверить индекс") logger.error("клиент не инициализован, невозможно проверить индекс")
def index(self, shout): def index(self, shout):
if not SEARCH_ENABLED:
return
if self.client: if self.client:
logger.info(f"Индексируем пост {shout.id}") logger.info(f"Индексируем пост {shout.id}")
index_body = { index_body = {
@ -164,8 +169,6 @@ class SearchService:
"media": shout.media, "media": shout.media,
} }
asyncio.create_task(self.perform_index(shout, index_body)) asyncio.create_task(self.perform_index(shout, index_body))
else:
logger.error("клиент не инициализован, невозможно проидексировать")
async def perform_index(self, shout, index_body): async def perform_index(self, shout, index_body):
if self.client: if self.client:
@ -179,6 +182,9 @@ class SearchService:
logger.error(f"Indexing error for shout {shout.id}: {e}") logger.error(f"Indexing error for shout {shout.id}: {e}")
async def search(self, text, limit, offset): async def search(self, text, limit, offset):
if not SEARCH_ENABLED:
return []
logger.info(f"Ищем: {text} {offset}+{limit}") logger.info(f"Ищем: {text} {offset}+{limit}")
search_body = { search_body = {
"query": {"multi_match": {"query": text, "fields": ["title", "lead", "subtitle", "body", "media"]}} "query": {"multi_match": {"query": text, "fields": ["title", "lead", "subtitle", "body", "media"]}}