diff --git a/searx/engines/redis_server.py b/searx/engines/redis_server.py new file mode 100644 index 00000000..6226cd04 --- /dev/null +++ b/searx/engines/redis_server.py @@ -0,0 +1,59 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" + Redis engine (Offline) +""" + +# pylint: disable=missing-function-docstring + +import redis + +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 = 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 ac71f93a..cfc44d66 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -941,6 +941,14 @@ engines: timeout : 10.0 disabled : True +# - 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