From e1a27b55cd612835d871034a83d8921e757621a6 Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 29 Jan 2024 04:41:46 +0300 Subject: [PATCH] inner-search-3 --- main.py | 4 ++-- resolvers/editor.py | 11 ++++----- resolvers/reader.py | 4 ++-- services/search.py | 55 +++++++++++++++++---------------------------- 4 files changed, 28 insertions(+), 46 deletions(-) diff --git a/main.py b/main.py index 8300b1e7..647cf1d1 100644 --- a/main.py +++ b/main.py @@ -16,7 +16,7 @@ from starlette.routing import Route from resolvers.webhook import WebhookEndpoint from services.rediscache import redis from services.schema import resolvers -from services.search import SearchService +from services.search import search from services.viewed import ViewedStorage from settings import DEV_SERVER_PID_FILE_NAME, MODE, SENTRY_DSN @@ -35,7 +35,7 @@ async def start_up(): await ViewedStorage.init() # start search service - await SearchService.init() + search.info() if MODE == 'development': # pid file management diff --git a/resolvers/editor.py b/resolvers/editor.py index a7276acb..81233bff 100644 --- a/resolvers/editor.py +++ b/resolvers/editor.py @@ -11,7 +11,7 @@ from services.auth import login_required from services.db import local_session from services.notify import notify_shout from services.schema import mutation, query -from services.search import SearchService +from services.search import search @query.field('get_shouts_drafts') @@ -82,9 +82,6 @@ async def create_shout(_, info, inp): # notifier await notify_shout(shout_dict, 'create') - - # search service indexing - SearchService.elastic.index_post(shout) return {'shout': shout_dict} @@ -190,9 +187,9 @@ async def update_shout( # noqa: C901 if not publish: await notify_shout(shout_dict, 'update') - - # search service indexing - SearchService.elastic.index_post(shout) + if shout.visibility is ShoutVisibility.COMMUNITY.value or shout.visibility is ShoutVisibility.PUBLIC.value: + # search service indexing + search.index_post(shout) return {'shout': shout_dict} diff --git a/resolvers/reader.py b/resolvers/reader.py index b3d10402..b90a86f1 100644 --- a/resolvers/reader.py +++ b/resolvers/reader.py @@ -14,7 +14,7 @@ from resolvers.topic import get_random_topic from services.auth import login_required from services.db import local_session from services.schema import query -from services.search import SearchService +from services.search import search_text from services.viewed import ViewedStorage @@ -312,7 +312,7 @@ async def load_shouts_feed(_, info, options): @query.field('load_shouts_search') async def load_shouts_search(_, _info, text, limit=50, offset=0): if text and len(text) > 2: - results = await SearchService.search(text, limit, offset) + results = await search_text(text, limit, offset) results_dict = {r['slug']: r for r in results} found_keys = list(results_dict.keys()) diff --git a/services/search.py b/services/search.py index 5e895b5c..3c731cff 100644 --- a/services/search.py +++ b/services/search.py @@ -1,12 +1,9 @@ -import asyncio import json import logging import os -from typing import List from elasticsearch import Elasticsearch -from orm.shout import Shout from services.rediscache import redis @@ -24,22 +21,18 @@ REDIS_TTL = 86400 # 1 day in seconds class SearchService: - lock = asyncio.Lock() - elastic = None - - def __init__(self, index_name, delete_index_on_startup): + async def __init__(self, index_name='search_index'): + logging.info('Initializing SearchService') self.index_name = index_name - self.delete_index_on_startup = delete_index_on_startup self.elasticsearch_client = Elasticsearch(f'{ELASTIC_URL}', verify_certs=False) - - if self.delete_index_on_startup: - self.delete_index() - self.check_index() if ELASTIC_REINDEX: self.recreate_index() + def info(self): + logging.info(f'Initializing SearchService {self.elasticsearch_client}') + def delete_index(self): self.elasticsearch_client.indices.delete(index=self.index_name, ignore_unavailable=True) @@ -127,27 +120,19 @@ class SearchService: for hit in hits ] - @staticmethod - async def init(): - self = SearchService - async with self.lock: - logging.info('Initializing SearchService') - try: - self.elastic = SearchService('shouts_index', False) - except Exception as exc: - logger.error(exc) - @staticmethod - async def search(text: str, limit: int = 50, offset: int = 0) -> List[Shout]: - payload = [] - self = SearchService - try: - # Use a key with a prefix to differentiate search results from other Redis data - redis_key = f'search:{text}' - # Use OpenSearchService.search_post method - payload = await self.elastic.search_post(text, limit, offset) - # Use Redis as cache with TTL - await redis.execute('SETEX', redis_key, REDIS_TTL, json.dumps(payload)) - except Exception as e: - logging.error(f'Error during search: {e}') - return payload +search = SearchService() + + +async def search_text(text: str, limit: int = 50, offset: int = 0): + payload = [] + try: + # Use a key with a prefix to differentiate search results from other Redis data + redis_key = f'search:{text}' + # Use OpenSearchService.search_post method + payload = search.search_post(text, limit, offset) + # Use Redis as cache with TTL + await redis.execute('SETEX', redis_key, REDIS_TTL, json.dumps(payload)) + except Exception as e: + logging.error(f'Error during search: {e}') + return payload