From 515cf5d5465c2a99b2a5fc66235aa1525525e723 Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Wed, 18 Apr 2018 15:18:54 +0300 Subject: [PATCH] package_autocomplete use solr --- ckan/config/solr/schema.xml | 18 +++++++++++++++++- ckan/lib/search/__init__.py | 2 +- ckan/logic/action/get.py | 35 +++++++++++++++++++---------------- 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/ckan/config/solr/schema.xml b/ckan/config/solr/schema.xml index 8e5018a2e2d..0f144de200b 100644 --- a/ckan/config/solr/schema.xml +++ b/ckan/config/solr/schema.xml @@ -24,7 +24,7 @@ - + @@ -81,6 +81,18 @@ schema. In this case the version should be set to the next CKAN version number. + + + + + + + + + + + + @@ -89,10 +101,12 @@ schema. In this case the version should be set to the next CKAN version number. + + @@ -165,6 +179,8 @@ schema. In this case the version should be set to the next CKAN version number. + + diff --git a/ckan/lib/search/__init__.py b/ckan/lib/search/__init__.py index dbc8ac12cc5..b3bb423c0ae 100644 --- a/ckan/lib/search/__init__.py +++ b/ckan/lib/search/__init__.py @@ -31,7 +31,7 @@ def text_traceback(): return res -SUPPORTED_SCHEMA_VERSIONS = ['2.8'] +SUPPORTED_SCHEMA_VERSIONS = ['2.8' ,'2.81'] DEFAULT_OPTIONS = { 'limit': 20, diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index 51d73d4bebf..0be5c932568 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -1496,34 +1496,37 @@ def package_autocomplete(context, data_dict): :rtype: list of dictionaries ''' - model = context['model'] - _check_access('package_autocomplete', context, data_dict) limit = data_dict.get('limit', 10) q = data_dict['q'] - like_q = u"%s%%" % q - - query = model.Session.query(model.Package) - query = query.filter(model.Package.state == 'active') - query = query.filter(model.Package.private == False) - query = query.filter(_or_(model.Package.name.ilike(like_q), - model.Package.title.ilike(like_q))) - query = query.limit(limit) + data_dict = { + 'fq': '+capacity:public', + 'q': ' OR '.join([ + 'name_ngram:{0}', + 'title_ngram:{0}', + 'name:{0}', + 'title:{0}', + ]).format(search.query.solr_literal(q)), + 'fl': ['name', 'title'], + 'rows': limit + } + query = search.query_for(model.Package) + results = query.run(data_dict)['results'] q_lower = q.lower() pkg_list = [] - for package in query: - if package.name.startswith(q_lower): + for package in results: + if q_lower in package['name']: match_field = 'name' - match_displayed = package.name + match_displayed = package['name'] else: match_field = 'title' - match_displayed = '%s (%s)' % (package.title, package.name) + match_displayed = '%s (%s)' % (package['title'], package['name']) result_dict = { - 'name': package.name, - 'title': package.title, + 'name': package['name'], + 'title': package['title'], 'match_field': match_field, 'match_displayed': match_displayed} pkg_list.append(result_dict)