on master help sign in
[fix] url bar autocomplete (opensearch suggestions)

Since #2593 is merged the OpenSearch-Format is buggy. The loop in [1] will change raw_text_query object and this will change also the value of `raw_text_query.query` on every `raw_text_query.changeQuery(result)`. This patch fixes this issue by storing the initial query value in `sug_prefix`. [1] https://github.com/searx/searx/blob/ac0fdc3b9670168de8061ed0e656dd66a567d741/searx/webapp.py#L804-L806 OpenSearch-Format:: [ "<query>", [ "<term 1>", "<term 2>", ... "<term n>" ], [ "<content 1>", "<content 2>", ..., "<content n>" ], [ "<url 1>", "<url 2>", ..., "<url n>" ] ] - https://www.google.com/support/enterprise/static/gsa/docs/admin/current/gsa_doc_set/xml_reference/query_suggestion.html#1080002 - https://developer.mozilla.org/en-US/docs/Archive/Add-ons/Supporting_search_suggestions_in_search_plugins#implementing_search_suggestion_support_on_the_server Legacy-Format:: [ "<term 1>", "<term 2>", ..., "<term n>" ] - https://www.google.com/support/enterprise/static/gsa/docs/admin/current/gsa_doc_set/xml_reference/query_suggestion.html#1081079 Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>

commit169438137ffe3d28bd855090960751e6804adea9 authorMarkus Heiser <markus.heiser@darmarit.de> dateSat 3 Apr 2021, 18:18 (6 years ago) parentac0fdc3
1 file changed+17−8
searx/webapp.py+17−8
searx/webapp.py+17−8
@@ -785,20 +785,26 @@ def autocompleter():
785785
786786 # parse query
787787 raw_text_query = RawTextQuery(request.form.get('q', ''), disabled_engines)
788+ sug_prefix = raw_text_query.getQuery()
788789
789790 # normal autocompletion results only appear if no inner results returned
790791 # and there is a query part
791− if len(raw_text_query.autocomplete_list) == 0 and len(raw_text_query.getQuery()) > 0:
792+ if len(raw_text_query.autocomplete_list) == 0 and len(sug_prefix) > 0:
793+
792794 # get language from cookie
793795 language = request.preferences.get_value('language')
794796 if not language or language == 'all':
795797 language = 'en'
796798 else:
797799 language = language.split('-')[0]
800+
798801 # run autocompletion
799− raw_results = search_autocomplete(request.preferences.get_value('autocomplete'),
800− raw_text_query.getQuery(), language)
802+ raw_results = search_autocomplete(
803+ request.preferences.get_value('autocomplete'), sug_prefix, language
804+ )
801805 for result in raw_results:
806+ # attention: this loop will change raw_text_query object and this is
807+ # the reason why the sug_prefix was stored before (see above)
802808 results.append(raw_text_query.changeQuery(result).getFullQuery())
803809
804810 if len(raw_text_query.autocomplete_list) > 0:
@@ -809,13 +815,16 @@ def autocompleter():
809815 for answer in answers:
810816 results.append(str(answer['answer']))
811817
812− # return autocompleter results
813818 if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
814− return Response(json.dumps(results),
815− mimetype='application/json')
819+ # the suggestion request comes from the searx search form
820+ suggestions = json.dumps(results)
821+ mimetype = 'application/json'
822+ else:
823+ # the suggestion request comes from browser's URL bar
824+ suggestions = json.dumps([sug_prefix, results])
825+ mimetype = 'application/x-suggestions+json'
816826
817− return Response(json.dumps([raw_text_query.query, results]),
818− mimetype='application/x-suggestions+json')
827+ return Response(suggestions, mimetype=mimetype)
819828
820829
821830@app.route('/preferences', methods=['GET', 'POST'])