Skip to content

Commit

Permalink
package_autocomplete use solr
Browse files Browse the repository at this point in the history
  • Loading branch information
smotornyuk committed Apr 18, 2018
1 parent 6c5c095 commit 515cf5d
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 18 deletions.
18 changes: 17 additions & 1 deletion ckan/config/solr/schema.xml
Expand Up @@ -24,7 +24,7 @@
<!-- We update the version when there is a backward-incompatible change to this
schema. In this case the version should be set to the next CKAN version number.
(x.y but not x.y.z since it needs to be a float) -->
<schema name="ckan" version="2.8">
<schema name="ckan" version="2.81">

<types>
<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
Expand Down Expand Up @@ -81,6 +81,18 @@ schema. In this case the version should be set to the next CKAN version number.
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>

<fieldType name="text_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="10"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="10"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>

</types>


Expand All @@ -89,10 +101,12 @@ schema. In this case the version should be set to the next CKAN version number.
<field name="id" type="string" indexed="true" stored="true" required="true" />
<field name="site_id" type="string" indexed="true" stored="true" required="true" />
<field name="title" type="text" indexed="true" stored="true" />
<field name="title_ngram" type="text_ngram" indexed="true" stored="true" />
<field name="entity_type" type="string" indexed="true" stored="true" omitNorms="true" />
<field name="dataset_type" type="string" indexed="true" stored="true" />
<field name="state" type="string" indexed="true" stored="true" omitNorms="true" />
<field name="name" type="string" indexed="true" stored="true" omitNorms="true" />
<field name="name_ngram" type="text_ngram" indexed="true" stored="true" />
<field name="revision_id" type="string" indexed="true" stored="true" omitNorms="true" />
<field name="version" type="string" indexed="true" stored="true" />
<field name="url" type="string" indexed="true" stored="true" omitNorms="true" />
Expand Down Expand Up @@ -165,6 +179,8 @@ schema. In this case the version should be set to the next CKAN version number.
<solrQueryParser defaultOperator="AND"/>

<copyField source="url" dest="urls"/>
<copyField source="title" dest="title_ngram"/>
<copyField source="name" dest="name_ngram"/>
<copyField source="ckan_url" dest="urls"/>
<copyField source="download_url" dest="urls"/>
<copyField source="res_url" dest="urls"/>
Expand Down
2 changes: 1 addition & 1 deletion ckan/lib/search/__init__.py
Expand Up @@ -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,
Expand Down
35 changes: 19 additions & 16 deletions ckan/logic/action/get.py
Expand Up @@ -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)
Expand Down

0 comments on commit 515cf5d

Please sign in to comment.