on master help sign in
Merge pull request #2652 from kvch/solr-engine

Add Apache Solr engine

commitdd34ac396cca75ff7b1690b00161d6c7253f46d0 authorAdam Tauber <asciimoo@gmail.com> dateMon 15 Mar 2021, 15:39 (6 years ago) parent1664258ff527e2
3 files changed+86
Makefile+1 searx/engines/solr.py+74 searx/settings.yml+11
Makefile+1
@@ -192,6 +192,7 @@ PYLINT_FILES=\
192192 searx/engines/google_images.py \
193193 searx/engines/mediathekviewweb.py \
194194 searx/engines/solidtorrents.py \
195+ searx/engines/solr.py \
195196 searx/engines/google_scholar.py \
196197 searx/engines/yahoo_news.py \
197198 searx/engines/apkmirror.py \
searx/engines/solr.pynew file+74
@@ -0,0 +1,74 @@
1+# SPDX-License-Identifier: AGPL-3.0-or-later
2+"""
3+ Solr
4+"""
5+
6+# pylint: disable=global-statement, missing-function-docstring
7+
8+from json import loads
9+from urllib.parse import urlencode
10+from searx.exceptions import SearxEngineAPIException
11+
12+
13+base_url = 'http://localhost:8983'
14+collection = ''
15+rows = 10
16+sort = '' # sorting: asc or desc
17+field_list = 'name' # list of field names to display on the UI
18+default_fields = '' # default field to query
19+query_fields = '' # query fields
20+_search_url = ''
21+paging = True
22+
23+
24+def init(_):
25+ if collection == '':
26+ raise ValueError('collection cannot be empty')
27+
28+ global _search_url
29+ _search_url = base_url + '/solr/' + collection + '/select?{params}'
30+
31+
32+def request(query, params):
33+ query_params = {'q': query, 'rows': rows}
34+ if field_list != '':
35+ query_params['fl'] = field_list
36+ if query_fields != '':
37+ query_params['qf'] = query_fields
38+ if default_fields != '':
39+ query_params['df'] = default_fields
40+ if sort != '':
41+ query_params['sort'] = sort
42+
43+ if 'pageno' in params:
44+ query_params['start'] = rows * (params['pageno'] - 1)
45+
46+ params['url'] = _search_url.format(params=urlencode(query_params))
47+
48+ return params
49+
50+
51+def response(resp):
52+ resp_json = __get_response(resp)
53+
54+ results = []
55+ for result in resp_json['response']['docs']:
56+ r = {key: str(value) for key, value in result.items()}
57+ if len(r) == 0:
58+ continue
59+ r['template'] = 'key-value.html'
60+ results.append(r)
61+
62+ return results
63+
64+
65+def __get_response(resp):
66+ try:
67+ resp_json = loads(resp.text)
68+ except Exception as e:
69+ raise SearxEngineAPIException("failed to parse response") from e
70+
71+ if 'error' in resp_json:
72+ raise SearxEngineAPIException(resp_json['error']['msg'])
73+
74+ return resp_json
searx/settings.yml+11
@@ -942,6 +942,17 @@ engines:
942942# api_client_id : *******
943943# api_client_secret : *******
944944
945+# - name : solr
946+# engine : solr
947+# shortcut : slr
948+# base_url : http://localhost:8983
949+# collection : collection_name
950+# sort : '' # sorting: asc or desc
951+# field_list : '' # comma separated list of field names to display on the UI
952+# default_fields : '' # default field to query
953+# query_fields : '' # query fields
954+# enable_http : True
955+
945956 - name : startpage
946957 engine : startpage
947958 shortcut : sp