[enh] add autocompletion for searx-specific strings

This commit is contained in:
Thomas Pointhuber 2015-01-10 16:42:57 +01:00
parent 29a526ff0e
commit 4e2dae30f0
3 changed files with 85 additions and 3 deletions

View File

@ -20,6 +20,85 @@ from lxml import etree
from requests import get from requests import get
from json import loads from json import loads
from urllib import urlencode from urllib import urlencode
from searx.languages import language_codes
from searx.engines import (
categories, engines, engine_shortcuts
)
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.getSearchQuery()) == 0:
return []
results = []
# check if current query stats with !bang
if full_query.getSearchQuery()[0] == '!':
if len(full_query.getSearchQuery()) == 1:
# show some example queries
# TODO, check if engine is not avaliable
results.append("!images")
results.append("!wikipedia")
results.append("!osm")
else:
engine_query = full_query.getSearchQuery()[1:]
# check if query starts with categorie name
for categorie in categories:
if categorie.startswith(engine_query):
results.append('!{categorie}'.format(categorie=categorie))
# check if query starts with engine name
for engine in engines:
if engine.startswith(engine_query):
results.append('!{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('!{engine_shortcut}'.format(engine_shortcut=engine_shortcut))
# check if current query stats with :bang
elif full_query.getSearchQuery()[0] == ':':
if len(full_query.getSearchQuery()) == 1:
# show some example queries
results.append(":en")
results.append(":en_us")
results.append(":english")
results.append(":united_kingdom")
else:
engine_query = full_query.getSearchQuery()[1:]
for lc in language_codes:
lang_id, lang_name, country = 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):
results.append(':{lang_name}'.format(lang_name=lang_name))
# check if query starts with country
if country.startswith(engine_query):
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): def dbpedia(query):

View File

@ -77,7 +77,7 @@ class Query(object):
if lang == lang_id\ if lang == lang_id\
or lang_id.startswith(lang)\ or lang_id.startswith(lang)\
or lang == lang_name\ or lang == lang_name\
or lang == country: or lang.replace('_', ' ') == country:
parse_next = True parse_next = True
self.languages.append(lang) self.languages.append(lang)
break break

View File

@ -46,7 +46,7 @@ from searx.languages import language_codes
from searx.https_rewrite import https_url_rewrite from searx.https_rewrite import https_url_rewrite
from searx.search import Search from searx.search import Search
from searx.query import Query from searx.query import Query
from searx.autocomplete import backends as autocomplete_backends from searx.autocomplete import searx_bang, backends as autocomplete_backends
from searx import logger from searx import logger
@ -352,8 +352,11 @@ def autocompleter():
if not completer: if not completer:
return return
# parse searx specific autocompleter results like !bang
raw_results = searx_bang(query)
# run autocompletion # run autocompletion
raw_results = completer(query.getSearchQuery()) raw_results.extend(completer(query.getSearchQuery()))
# parse results (write :language and !engine back to result string) # parse results (write :language and !engine back to result string)
results = [] results = []