diff --git a/searx/engines/redis_server.py b/searx/engines/redis_server.py new file mode 100644 index 000000000..e8c248e32 --- /dev/null +++ b/searx/engines/redis_server.py @@ -0,0 +1,77 @@ +# 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): + global _redis_client # pylint: disable=global-statement + _redis_client = redis.StrictRedis( + host = host, + port = port, + db = db, + password = password or None, + decode_responses = True, + ) + +def search(query, _params): + global _redis_client # pylint: disable=global-statement + + 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): + global _redis_client # pylint: disable=global-statement + + 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 diff --git a/searx/templates/oscar/result_templates/key-value.html b/searx/templates/oscar/result_templates/key-value.html index d5c56a189..9d75682d4 100644 --- a/searx/templates/oscar/result_templates/key-value.html +++ b/searx/templates/oscar/result_templates/key-value.html @@ -1,8 +1,8 @@ {% from 'oscar/macros.html' import result_footer, result_footer_rtl with context %} -
+
{% for key, value in result.items() %} - {% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions'] %} + {% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions', 'pretty_url', 'parsed_url'] %} {% continue %} {% endif %} diff --git a/searx/templates/simple/result_templates/key-value.html b/searx/templates/simple/result_templates/key-value.html index eebaa2c85..cb7f829ee 100644 --- a/searx/templates/simple/result_templates/key-value.html +++ b/searx/templates/simple/result_templates/key-value.html @@ -1,6 +1,6 @@
{% for key, value in result.items() %} - {% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions'] %} + {% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions', 'pretty_url', 'parsed_url'] %} {% continue %} {% endif %}