From 4f828d5053e551b3a2efaa3c50ac2630c961a41b Mon Sep 17 00:00:00 2001 From: cir9no <44470218+cir9no@users.noreply.github.com> Date: Wed, 21 Aug 2024 17:11:48 +0800 Subject: [PATCH] feat/seasearch: add res highlight sup in wiki seasearch --- seafevent_server/request_handler.py | 3 ++- seasearch/index_store/wiki_index.py | 21 ++++++++++++++------- seasearch/index_task/wiki_index_updater.py | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/seafevent_server/request_handler.py b/seafevent_server/request_handler.py index fbd372c0..cc254326 100644 --- a/seafevent_server/request_handler.py +++ b/seafevent_server/request_handler.py @@ -133,8 +133,9 @@ def search(): return {'results': results}, 200 + @app.route('/wiki-search', methods=['POST']) -def search(): +def search_wikis(): is_valid = check_auth_token(request) if not is_valid: return {'error_msg': 'Permission denied'}, 403 diff --git a/seasearch/index_store/wiki_index.py b/seasearch/index_store/wiki_index.py index fee94c7a..3d5eb5ea 100644 --- a/seasearch/index_store/wiki_index.py +++ b/seasearch/index_store/wiki_index.py @@ -29,6 +29,7 @@ class WikiIndex(object): }, 'content': { 'type': 'text', + 'highlightable': True, 'fields': { 'ngram': { 'type': 'text', @@ -132,7 +133,7 @@ def get_wiki_conf(self, wiki_id): # Get wiki config dict conf_path = posixpath.join(WIKI_CONFIG_PATH, WIKI_CONFIG_FILE_NAME) conf_id = seafile_api.get_file_id_by_path(wiki_id, conf_path) - + f = fs_mgr.load_seafile(wiki_id, 1, conf_id) return json.loads(f.get_content().decode()) @@ -143,7 +144,7 @@ def extract_ids_from_navigation(navigation_items, navigation_ids): navigation_ids.add(item['id']) if 'children' in item and item['children']: extract_ids_from_navigation(item['children'], navigation_ids) - + navigation_ids = set() extract_ids_from_navigation(config['navigation'], navigation_ids) doc_uuids = [page['docUuid'] for page in config['pages'] if page['id'] in navigation_ids] @@ -156,7 +157,7 @@ def extract_ids_from_navigation(navigation_items, navigation_ids): navigation_ids.add(item['id']) if 'children' in item and item['children']: extract_ids_from_navigation(item['children'], navigation_ids) - + navigation_ids = set() extract_ids_from_navigation(config['navigation'], navigation_ids) non_navigation_doc_uuids = [page['docUuid'] for page in config['pages'] if page['id'] not in navigation_ids] @@ -252,13 +253,18 @@ def search_wikis(self, wikis, keyword, start=0, size=10): 'from': start, 'size': size, '_source': ['wiki_id', 'doc_uuid'], - 'sort': ['_score'] + 'sort': ['_score'], + "highlight": { + "pre_tags": [""], + "post_tags": [""], + "fields": {"content": {}}, + }, } index_name = WIKI_INDEX_PREFIX + wiki_id index_info = {"index": index_name} bulk_search_params.append(index_info) bulk_search_params.append(data) - + # Get wiki title conf = self.get_wiki_conf(wiki_id) doc_uuids = self.extract_doc_uuids(conf) @@ -269,7 +275,6 @@ def search_wikis(self, wikis, keyword, start=0, size=10): uuid_name_list.append((page_uuid, page["name"], wiki_id)) results = self.seasearch_api.m_search(bulk_search_params) - res_wikis = [] for result in results.get('responses'): hits = result.get('hits', {}).get('hits', []) @@ -288,6 +293,8 @@ def search_wikis(self, wikis, keyword, start=0, size=10): '_id': _id, 'type': 'wiki_content' } + if highlight_content := hit.get('highlight').get('content', [None])[0]: + r.update(matching_content=highlight_content) res_wikis.append(r) res_wikis = sorted(res_wikis, key=lambda row: row['score'], reverse=True)[:size] @@ -302,6 +309,6 @@ def search_wikis(self, wikis, keyword, start=0, size=10): 'type': 'wiki_title' } query_match.append(r_t) - + query_match.extend(res_wikis) return query_match diff --git a/seasearch/index_task/wiki_index_updater.py b/seasearch/index_task/wiki_index_updater.py index c3869d4e..9a2a769d 100644 --- a/seasearch/index_task/wiki_index_updater.py +++ b/seasearch/index_task/wiki_index_updater.py @@ -128,7 +128,7 @@ def run(self): sched = GeventScheduler() logging.info('Start to update wiki index...') try: - sched.add_job(update_wiki_indexes, CronTrigger(minute='*/5'), + sched.add_job(update_wiki_indexes, CronTrigger(second='*/30'), args=(self.wiki_status_index, self.wiki_index, self.index_manager, self.repo_data)) except Exception as e: logging.exception('periodical update wiki index error: %s', e)