[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] ac0fdc3b96/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>
			
			
This commit is contained in:
		
							parent
							
								
									ac0fdc3b96
								
							
						
					
					
						commit
						169438137f
					
				| @ -785,20 +785,26 @@ def autocompleter(): | |||||||
| 
 | 
 | ||||||
|     # parse query |     # parse query | ||||||
|     raw_text_query = RawTextQuery(request.form.get('q', ''), disabled_engines) |     raw_text_query = RawTextQuery(request.form.get('q', ''), disabled_engines) | ||||||
|  |     sug_prefix = raw_text_query.getQuery() | ||||||
| 
 | 
 | ||||||
|     # normal autocompletion results only appear if no inner results returned |     # normal autocompletion results only appear if no inner results returned | ||||||
|     # and there is a query part |     # and there is a query part | ||||||
|     if len(raw_text_query.autocomplete_list) == 0 and len(raw_text_query.getQuery()) > 0: |     if len(raw_text_query.autocomplete_list) == 0 and len(sug_prefix) > 0: | ||||||
|  | 
 | ||||||
|         # get language from cookie |         # get language from cookie | ||||||
|         language = request.preferences.get_value('language') |         language = request.preferences.get_value('language') | ||||||
|         if not language or language == 'all': |         if not language or language == 'all': | ||||||
|             language = 'en' |             language = 'en' | ||||||
|         else: |         else: | ||||||
|             language = language.split('-')[0] |             language = language.split('-')[0] | ||||||
|  | 
 | ||||||
|         # run autocompletion |         # run autocompletion | ||||||
|         raw_results = search_autocomplete(request.preferences.get_value('autocomplete'), |         raw_results = search_autocomplete( | ||||||
|                                           raw_text_query.getQuery(), language) |             request.preferences.get_value('autocomplete'), sug_prefix, language | ||||||
|  |         ) | ||||||
|         for result in raw_results: |         for result in raw_results: | ||||||
|  |             # attention: this loop will change raw_text_query object and this is | ||||||
|  |             # the reason why the sug_prefix was stored before (see above) | ||||||
|             results.append(raw_text_query.changeQuery(result).getFullQuery()) |             results.append(raw_text_query.changeQuery(result).getFullQuery()) | ||||||
| 
 | 
 | ||||||
|     if len(raw_text_query.autocomplete_list) > 0: |     if len(raw_text_query.autocomplete_list) > 0: | ||||||
| @ -809,13 +815,16 @@ def autocompleter(): | |||||||
|         for answer in answers: |         for answer in answers: | ||||||
|             results.append(str(answer['answer'])) |             results.append(str(answer['answer'])) | ||||||
| 
 | 
 | ||||||
|     # return autocompleter results |  | ||||||
|     if request.headers.get('X-Requested-With') == 'XMLHttpRequest': |     if request.headers.get('X-Requested-With') == 'XMLHttpRequest': | ||||||
|         return Response(json.dumps(results), |         # the suggestion request comes from the searx search form | ||||||
|                         mimetype='application/json') |         suggestions = json.dumps(results) | ||||||
|  |         mimetype = 'application/json' | ||||||
|  |     else: | ||||||
|  |         # the suggestion request comes from browser's URL bar | ||||||
|  |         suggestions = json.dumps([sug_prefix, results]) | ||||||
|  |         mimetype = 'application/x-suggestions+json' | ||||||
| 
 | 
 | ||||||
|     return Response(json.dumps([raw_text_query.query, results]), |     return Response(suggestions, mimetype=mimetype) | ||||||
|                     mimetype='application/x-suggestions+json') |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @app.route('/preferences', methods=['GET', 'POST']) | @app.route('/preferences', methods=['GET', 'POST']) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Markus Heiser
						Markus Heiser