Pārlūkot izejas kodu

[search] Backend for autocomplete with Solr suggest

Expect a /suggest handler
Use the default dictionary by default
Romain Rigaux 10 gadi atpakaļ
vecāks
revīzija
66ef9e3

+ 2 - 0
apps/search/src/search/models.py

@@ -481,6 +481,8 @@ class Collection2(object):
         'to': 'NOW',
         'truncate': True
       }
+    if 'suggest' not in props['collection']:
+      props['collection']['suggest'] = {'enabled': False, 'dictionary': ''}
 
     for facet in props['collection']['facets']:
       properties = facet['properties']

+ 4 - 3
apps/search/src/search/static/search/js/search.ko.js

@@ -449,6 +449,7 @@ var Collection = function (vm, collection) {
   self.name = ko.mapping.fromJS(collection.name);
   self.label = ko.mapping.fromJS(collection.label);
   self.description = ko.observable(typeof collection.description != "undefined" && collection.description != null ? collection.description : "");
+  self.suggest = ko.mapping.fromJS(collection.suggest);
   self.enabled = ko.mapping.fromJS(collection.enabled);
   self.autorefresh = ko.mapping.fromJS(collection.autorefresh);
   self.autorefreshSeconds = ko.mapping.fromJS(collection.autorefreshSeconds || 60);
@@ -459,7 +460,7 @@ var Collection = function (vm, collection) {
   });
   self.timeFilter.from.subscribe(function () {
     vm.search();
-  });  
+  });
   self.timeFilter.to.subscribe(function () {
     vm.search();
   });
@@ -684,7 +685,7 @@ var Collection = function (vm, collection) {
     }
     return null;
   }
- 
+
   self.addFacet = function (facet_json) {
     self.removeFacet(function(){return facet_json.widget_id});
     logGA('add_facet/' + facet_json.widgetType);
@@ -970,7 +971,7 @@ var Collection = function (vm, collection) {
           syncArray(self.fields, data.collection.collection.fields, false);
         }
         // After sync the dynamic fields
-        self.syncDynamicFields()
+        self.syncDynamicFields();
     }).fail(function (xhr, textStatus, errorThrown) {});
   };
 

+ 8 - 0
apps/search/src/search/templates/search.mako

@@ -1736,6 +1736,14 @@ ${ dashboard.layout_skeleton() }
               </div>
             </div>
           </fieldset>
+            <div class="control-group">
+              <label class="control-label" for="settingsdescription">${ _('Autocomplete') }</label>
+              <div class="controls">
+                <input type="checkbox" data-bind="checked: $root.collection.suggest.enabled" style="margin-bottom: 0" />
+                <input type="text" class="input-xlarge" data-bind="value: $root.collection.suggest.dictionary" style="margin-bottom: 0" placeholder="${ _('Dictionary name or blank for default') }" />
+              </div>
+            </div>
+          </fieldset>
         </form>
       </div>
     </div>

+ 1 - 1
apps/search/src/search/urls.py

@@ -29,7 +29,7 @@ urlpatterns = patterns('search.views',
 
   # Ajax
   # Search
-  url(r'^suggest/(?P<collection_id>\w+)/(?P<query>\w+)?$', 'query_suggest', name='query_suggest'),
+  url(r'^suggest/$', 'query_suggest', name='query_suggest'),
   url(r'^index/fields/dynamic$', 'index_fields_dynamic', name='index_fields_dynamic'),
   url(r'^template/new_facet$', 'new_facet', name='new_facet'),
   url(r'^get_document$', 'get_document', name='get_document'),

+ 2 - 2
apps/search/src/search/views.py

@@ -277,8 +277,8 @@ def query_suggest(request):
   solr_query['dictionary'] = collection['suggest']['dictionary']
 
   try:
-    response = SolrApi(SOLR_URL.get(), request.user).suggest(solr_query, hue_collection)
-    result['message'] = response
+    response = SolrApi(SOLR_URL.get(), request.user).suggest(collection['name'], solr_query)
+    result['response'] = response
     result['status'] = 0
   except Exception, e:
     result['message'] = force_unicode(e)

+ 9 - 3
desktop/libs/libsolr/src/libsolr/api.py

@@ -415,13 +415,19 @@ class SolrApi(object):
     return self._get_json(response)
 
 
-  def suggest(self, solr_query, hue_core):
+  def suggest(self, collection, query):
     try:
       params = self._get_params() + (
-          ('q', solr_query['q']),
+          ('suggest', 'true'),
+          ('suggest.build', 'true'),
+          ('suggest.q', query['q']),
           ('wt', 'json'),
       )
-      response = self._root.get('%(collection)s/suggest' % solr_query, params)
+      if query.get('dictionary'):
+        params += (
+            ('suggest.dictionary', query['dictionary']),
+        )
+      response = self._root.get('%s/suggest' % collection, params)
       return self._get_json(response)
     except RestException, e:
       raise PopupException(e, title=_('Error while accessing Solr'))