From e4b6558339ae5c78071a78bfbdc5924470882af7 Mon Sep 17 00:00:00 2001 From: Adam Tauber Date: Sun, 30 May 2021 19:20:17 +0200 Subject: [PATCH] [enh] add redis offline engine / https://redis.io/ Slightly modified merge of commit [97269be6], [01a8a5814a] and [c8d2b5eb] from searx. [97269be6] https://github.com/searx/searx/commit/97269be6 [01a8a581] https://github.com/searx/searx/commit/01a8a581 [c8d2b5eb] https://github.com/searx/searx/commit/c8d2b5eb Signed-off-by: Markus Heiser --- searx/engines/redis_server.py | 75 +++++++++++++++++++++++++++++++++++ searx/settings.yml | 9 +++++ 2 files changed, 84 insertions(+) create mode 100644 searx/engines/redis_server.py diff --git a/searx/engines/redis_server.py b/searx/engines/redis_server.py new file mode 100644 index 000000000..da7cf5a4f --- /dev/null +++ b/searx/engines/redis_server.py @@ -0,0 +1,75 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +# lint: pylint +# pylint: disable=missing-function-docstring +"""Redis engine (offline) + +""" + +import redis # pylint: disable=import-error + +engine_type = 'offline' + +# redis connection variables +host = '127.0.0.1' +port = 6379 +password = '' +db = 0 + +# engine specific variables +paging = False +result_template = 'key-value.html' +exact_match_only = True + +redis_client = None +def init(_engine_settings): + # pylint: disable=global-statement + global redis_client + redis_client = redis.StrictRedis( + host = host, + port = port, + db = db, + password = password or None, + decode_responses = True, + ) + +def search(query, _params): + + if not exact_match_only: + return search_keys(query) + + ret = redis_client.hgetall(query) + if ret: + ret['template'] = result_template + return [ret] + + if ' ' in query: + qset, rest = query.split(' ', 1) + ret = [] + for res in redis_client.hscan_iter( + qset, match='*{}*'.format(rest) + ): + ret.append({ + res[0]: res[1], + 'template': result_template, + }) + return ret + return [] + +def search_keys(query): + ret = [] + for key in redis_client.scan_iter( + match='*{}*'.format(query) + ): + key_type = redis_client.type(key) + res = None + + if key_type == 'hash': + res = redis_client.hgetall(key) + elif key_type == 'list': + res = dict(enumerate(redis_client.lrange(key, 0, -1))) + + if res: + res['template'] = result_template + res['redis_key'] = key + ret.append(res) + return ret diff --git a/searx/settings.yml b/searx/settings.yml index 0c4ba5f54..63d100ca5 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -960,6 +960,15 @@ engines: timeout : 10.0 disabled : True + # Required dependency: redis + # - name: myredis + # engine: redis_server + # exact_match_only: False + # host: '127.0.0.1' + # port: 6379 + # password: '' + # db: 0 + # tmp suspended: bad certificate # - name : scanr structures # shortcut: scs