diff options
author | Alexandre Flament <alex@al-f.net> | 2021-02-22 18:13:50 +0100 |
---|---|---|
committer | Alexandre Flament <alex@al-f.net> | 2021-03-01 19:12:32 +0100 |
commit | 63f17d2e4c735767bfcb2d4fdb77d8c9ad8d9265 (patch) | |
tree | 4a4b3cae4bc9223949694d77c98e6e7443c04a65 /searx/autocomplete.py | |
parent | 4fa1290c11402f173c39a89324fe45c1b659fd9d (diff) | |
download | searxng-63f17d2e4c735767bfcb2d4fdb77d8c9ad8d9265.tar.gz searxng-63f17d2e4c735767bfcb2d4fdb77d8c9ad8d9265.zip |
[enh] autocomplete refactoring, autocomplete on external bangs
Diffstat (limited to 'searx/autocomplete.py')
-rw-r--r-- | searx/autocomplete.py | 96 |
1 files changed, 15 insertions, 81 deletions
diff --git a/searx/autocomplete.py b/searx/autocomplete.py index fbe634a5b..75992a1d8 100644 --- a/searx/autocomplete.py +++ b/searx/autocomplete.py @@ -20,97 +20,20 @@ from lxml import etree from json import loads from urllib.parse import urlencode +from requests import RequestException + from searx import settings -from searx.languages import language_codes -from searx.engines import ( - categories, engines, engine_shortcuts -) from searx.poolrequests import get as http_get +from searx.exceptions import SearxEngineResponseException def get(*args, **kwargs): if 'timeout' not in kwargs: kwargs['timeout'] = settings['outgoing']['request_timeout'] - + kwargs['raise_for_httperror'] = True return http_get(*args, **kwargs) -def searx_bang(full_query): - '''check if the searchQuery contain a bang, and create fitting autocompleter results''' - # check if there is a query which can be parsed - if len(full_query.getQuery()) == 0: - return [] - - results = [] - - # check if current query stats with !bang - first_char = full_query.getQuery()[0] - if first_char == '!' or first_char == '?': - if len(full_query.getQuery()) == 1: - # show some example queries - # TODO, check if engine is not avaliable - results.append(first_char + "images") - results.append(first_char + "wikipedia") - results.append(first_char + "osm") - else: - engine_query = full_query.getQuery()[1:] - - # check if query starts with categorie name - for categorie in categories: - if categorie.startswith(engine_query): - results.append(first_char + '{categorie}'.format(categorie=categorie)) - - # check if query starts with engine name - for engine in engines: - if engine.startswith(engine_query.replace('_', ' ')): - results.append(first_char + '{engine}'.format(engine=engine.replace(' ', '_'))) - - # check if query starts with engine shortcut - for engine_shortcut in engine_shortcuts: - if engine_shortcut.startswith(engine_query): - results.append(first_char + '{engine_shortcut}'.format(engine_shortcut=engine_shortcut)) - - # check if current query stats with :bang - elif first_char == ':': - if len(full_query.getQuery()) == 1: - # show some example queries - results.append(":en") - results.append(":en_us") - results.append(":english") - results.append(":united_kingdom") - else: - engine_query = full_query.getQuery()[1:] - - for lc in language_codes: - lang_id, lang_name, country, english_name = map(str.lower, lc) - - # check if query starts with language-id - if lang_id.startswith(engine_query): - if len(engine_query) <= 2: - results.append(':{lang_id}'.format(lang_id=lang_id.split('-')[0])) - else: - results.append(':{lang_id}'.format(lang_id=lang_id)) - - # check if query starts with language name - if lang_name.startswith(engine_query) or english_name.startswith(engine_query): - results.append(':{lang_name}'.format(lang_name=lang_name)) - - # check if query starts with country - if country.startswith(engine_query.replace('_', ' ')): - results.append(':{country}'.format(country=country.replace(' ', '_'))) - - # remove duplicates - result_set = set(results) - - # remove results which are already contained in the query - for query_part in full_query.query_parts: - if query_part in result_set: - result_set.remove(query_part) - - # convert result_set back to list - return list(result_set) - - def dbpedia(query, lang): # dbpedia autocompleter, no HTTPS autocomplete_url = 'https://lookup.dbpedia.org/api/search.asmx/KeywordSearch?' @@ -204,3 +127,14 @@ backends = {'dbpedia': dbpedia, 'qwant': qwant, 'wikipedia': wikipedia } + + +def search_autocomplete(backend_name, query, lang): + backend = backends.get(backend_name) + if backend is None: + return [] + + try: + return backend(query, lang) + except (RequestException, SearxEngineResponseException): + return [] |