[enh] autocomplete refactoring, autocomplete on external bangs

This commit is contained in:
Alexandre Flament 2021-02-22 18:13:50 +01:00
parent 4fa1290c11
commit 63f17d2e4c
4 changed files with 496 additions and 221 deletions

View file

@ -74,12 +74,13 @@ from searx.languages import language_codes as languages
from searx.search import SearchWithPlugins, initialize as search_initialize
from searx.search.checker import get_result as checker_get_result
from searx.query import RawTextQuery
from searx.autocomplete import searx_bang, backends as autocomplete_backends
from searx.autocomplete import search_autocomplete, backends as autocomplete_backends
from searx.plugins import plugins
from searx.plugins.oa_doi_rewrite import get_doi_resolver
from searx.preferences import Preferences, ValidationException, LANGUAGE_CODES
from searx.answerers import answerers
from searx.poolrequests import get_global_proxies
from searx.answerers import ask
from searx.metrology.error_recorder import errors_per_engines
# serve pages with HTTP/1.1
@ -763,27 +764,18 @@ def about():
def autocompleter():
"""Return autocompleter results"""
# run autocompleter
results = []
# set blocked engines
disabled_engines = request.preferences.engines.get_disabled()
# parse query
raw_text_query = RawTextQuery(request.form.get('q', ''), disabled_engines)
# check if search query is set
if not raw_text_query.getQuery():
return '', 400
# run autocompleter
completer = autocomplete_backends.get(request.preferences.get_value('autocomplete'))
# parse searx specific autocompleter results like !bang
raw_results = searx_bang(raw_text_query)
# normal autocompletion results only appear if no inner results returned
# and there is a query part besides the engine and language bangs
if len(raw_results) == 0 and completer and (len(raw_text_query.query_parts) > 1 or
(len(raw_text_query.languages) == 0 and
not raw_text_query.specific)):
# and there is a query part
if len(raw_text_query.autocomplete_list) == 0 and len(raw_text_query.getQuery()) > 0:
# get language from cookie
language = request.preferences.get_value('language')
if not language or language == 'all':
@ -791,15 +783,18 @@ def autocompleter():
else:
language = language.split('-')[0]
# run autocompletion
raw_results.extend(completer(raw_text_query.getQuery(), language))
raw_results = search_autocomplete(request.preferences.get_value('autocomplete'),
raw_text_query.getQuery(), language)
for result in raw_results:
results.append(raw_text_query.changeQuery(result).getFullQuery())
# parse results (write :language and !engine back to result string)
results = []
for result in raw_results:
raw_text_query.changeQuery(result)
if len(raw_text_query.autocomplete_list) > 0:
for autocomplete_text in raw_text_query.autocomplete_list:
results.append(raw_text_query.get_autocomplete_full_query(autocomplete_text))
# add parsed result
results.append(raw_text_query.getFullQuery())
for answers in ask(raw_text_query):
for answer in answers:
results.append(str(answer['answer']))
# return autocompleter results
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':