mirror of
https://github.com/searxng/searxng.git
synced 2025-07-14 16:59:21 +02:00
[enh] autocomplete refactoring, autocomplete on external bangs
This commit is contained in:
parent
4fa1290c11
commit
63f17d2e4c
4 changed files with 496 additions and 221 deletions
|
@ -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 []
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue