diff options
author | Adam Tauber <asciimoo@gmail.com> | 2021-05-30 19:20:17 +0200 |
---|---|---|
committer | Markus Heiser <markus.heiser@darmarit.de> | 2021-06-01 11:51:25 +0200 |
commit | e4b6558339ae5c78071a78bfbdc5924470882af7 (patch) | |
tree | 1b804807a3f3860a1960846fb1b0113b3b442d49 /searx/engines/redis_server.py | |
parent | e33858d6ef81d6b48f1e0fbd56252383ed6e032e (diff) | |
download | searxng-e4b6558339ae5c78071a78bfbdc5924470882af7.tar.gz searxng-e4b6558339ae5c78071a78bfbdc5924470882af7.zip |
[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 <markus.heiser@darmarit.de>
Diffstat (limited to 'searx/engines/redis_server.py')
-rw-r--r-- | searx/engines/redis_server.py | 75 |
1 files changed, 75 insertions, 0 deletions
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 |