浏览代码

[search] Multi facet filtering

- multi facet filter (right now you can choose just one)
- enable/disable facets (that should speed up things and show the power of search)
  append ?facets=0 to the URL
Enrico Berti 13 年之前
父节点
当前提交
ad4bbab

+ 1 - 0
apps/search/src/search/forms.py

@@ -26,3 +26,4 @@ class QueryForm(forms.Form):
   sort = forms.CharField(label='', max_length=256, required=False, initial='', widget=forms.HiddenInput(), help_text='Solr sort')
   sort = forms.CharField(label='', max_length=256, required=False, initial='', widget=forms.HiddenInput(), help_text='Solr sort')
   rows = forms.CharField(label='', required=False, initial='', widget=forms.HiddenInput(), help_text='Solr records per page')
   rows = forms.CharField(label='', required=False, initial='', widget=forms.HiddenInput(), help_text='Solr records per page')
   start = forms.CharField(label='', required=False, initial='', widget=forms.HiddenInput(), help_text='Solr start record')
   start = forms.CharField(label='', required=False, initial='', widget=forms.HiddenInput(), help_text='Solr start record')
+  facets = forms.CharField(label='', required=False, initial='', widget=forms.HiddenInput(), help_text='Show hide facet search')

+ 32 - 19
apps/search/src/search/templates/index.mako

@@ -129,22 +129,32 @@ ${ commonheader(_('Search'), "search", user) }
 
 
 <div class="container-fluid">
 <div class="container-fluid">
     <div class="row-fluid">
     <div class="row-fluid">
+        %if solr_query['facets'] == 1:
         <div class="span3">
         <div class="span3">
             <div class="well" style="padding: 8px 0;">
             <div class="well" style="padding: 8px 0;">
             <ul class="nav nav-list">
             <ul class="nav nav-list">
                 % if solr_query['fq']:
                 % if solr_query['fq']:
-                    <li class="nav-header">Current filter</li>
-                    <li style="margin-bottom: 20px"><a href="?query=${ solr_query['q'] }&sort=${solr_query["sort"]}">${solr_query['fq']} <i class="icon-trash"></i></a></li>
+                    <li class="nav-header">${_('Current filter')}</li>
+                    %for fq in solr_query['fq'].split('|'):
+                      %if fq:
+                        <%
+                          removeList = solr_query['fq'].split('|')
+                          removeList.remove(fq)
+                        %>
+                        <li><a href="?query=${ solr_query['q'] }&fq=${'|'.join(removeList)}&sort=${solr_query["sort"]}">${fq} <i class="icon-trash"></i></a></li>
+                      %endif
+                    %endfor
+                    <li style="margin-bottom: 20px"></li>
                 % endif
                 % endif
                 % if response and response['facet_counts']:
                 % if response and response['facet_counts']:
                     % if response['facet_counts']['facet_fields']:
                     % if response['facet_counts']['facet_fields']:
-                        <h4>Fields</h4>
+                        <h4>${_('Fields')}</h4>
                         % for cat in response['facet_counts']['facet_fields']:
                         % for cat in response['facet_counts']['facet_fields']:
                             % if response['facet_counts']['facet_fields'][cat]:
                             % if response['facet_counts']['facet_fields'][cat]:
                             <li class="nav-header">${cat}</li>
                             <li class="nav-header">${cat}</li>
                             % for subcat, count in macros.pairwise(response['facet_counts']['facet_fields'][cat]):
                             % for subcat, count in macros.pairwise(response['facet_counts']['facet_fields'][cat]):
                               %if count > 0 and subcat != "":
                               %if count > 0 and subcat != "":
-                                <li><a href="?query=${ solr_query['q'] }&fq=${ cat }:${ subcat }&sort=${solr_query["sort"]}">${subcat} (${ count })</a></li>
+                                <li><a href="?query=${ solr_query['q'] }&fq=${ solr_query['fq'] }|${ cat }:${ subcat }&sort=${solr_query["sort"]}">${subcat} (${ count })</a></li>
                               %endif
                               %endif
                             % endfor
                             % endfor
                             % endif
                             % endif
@@ -152,13 +162,13 @@ ${ commonheader(_('Search'), "search", user) }
                     %endif
                     %endif
 
 
                     % if response['facet_counts']['facet_ranges']:
                     % if response['facet_counts']['facet_ranges']:
-                        <h4>Ranges</h4>
+                        <h4>${_('Ranges')}</h4>
                         % for cat in response['facet_counts']['facet_ranges']:
                         % for cat in response['facet_counts']['facet_ranges']:
                             % if response['facet_counts']['facet_ranges'][cat]:
                             % if response['facet_counts']['facet_ranges'][cat]:
                             <li class="nav-header">${cat}</li>
                             <li class="nav-header">${cat}</li>
                             % for range, count in macros.pairwise(response['facet_counts']['facet_ranges'][cat]['counts']):
                             % for range, count in macros.pairwise(response['facet_counts']['facet_ranges'][cat]['counts']):
                               %if count > 0:
                               %if count > 0:
-                                <li><a href="?query=${ solr_query['q'] }&fq=${ cat }:${ range }&sort=${solr_query["sort"]}">${ range } (${ count })</a></li>
+                                <li><a href="?query=${ solr_query['q'] }&fq=${ solr_query['fq'] }|${ cat }:${ range }&sort=${solr_query["sort"]}">${ range } (${ count })</a></li>
                               %endif
                               %endif
                             % endfor
                             % endfor
                             % endif
                             % endif
@@ -166,13 +176,13 @@ ${ commonheader(_('Search'), "search", user) }
                     %endif
                     %endif
 
 
                     % if response['facet_counts']['facet_dates']:
                     % if response['facet_counts']['facet_dates']:
-                        <h4>Dates</h4>
+                        <h4>${_('Dates')}</h4>
                         % for cat in response['facet_counts']['facet_dates']:
                         % for cat in response['facet_counts']['facet_dates']:
                             % if response['facet_counts']['facet_dates'][cat]:
                             % if response['facet_counts']['facet_dates'][cat]:
                             <li class="nav-header">${cat}</li>
                             <li class="nav-header">${cat}</li>
                             % for date, count in response['facet_counts']['facet_dates'][cat].iteritems():
                             % for date, count in response['facet_counts']['facet_dates'][cat].iteritems():
                               % if date not in ('start', 'end', 'gap') and count > 0:
                               % if date not in ('start', 'end', 'gap') and count > 0:
-                                <li><a href="?query=${ solr_query['q'] }&fq=${ cat }:${ date }&sort=${solr_query["sort"]}">${ date } (${ count })</a></li>
+                                <li><a href="?query=${ solr_query['q'] }&fq=${ solr_query['fq'] }|${ cat }:${ date }&sort=${solr_query["sort"]}">${ date } (${ count })</a></li>
                               % endif
                               % endif
                             % endfor
                             % endfor
                             % endif
                             % endif
@@ -183,20 +193,23 @@ ${ commonheader(_('Search'), "search", user) }
             </div>
             </div>
         </div>
         </div>
         <div class="span9">
         <div class="span9">
+        %else:
+        <div class="span12">
+        %endif
             <form class="form-search well">
             <form class="form-search well">
                 <i class="twitter-logo"></i>
                 <i class="twitter-logo"></i>
                 ${ search_form }
                 ${ search_form }
-                <button class="btn" type="submit">Search</button>
+                <button class="btn" type="submit">${_('Search')}</button>
                 <div class="btn-group pull-right">
                 <div class="btn-group pull-right">
                   <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
                   <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
-                    Sort by
+                    ${_('Sort by')}
                     <span class="caret"></span>
                     <span class="caret"></span>
                   </a>
                   </a>
                   <ul class="dropdown-menu">
                   <ul class="dropdown-menu">
-                    <li><a href="?query=${solr_query["q"]}&fq=${solr_query["fq"]}&sort=created_at+desc&rows=${solr_query["rows"]}&start=${solr_query["start"]}">Date</a></li>
-                    <li><a href="?query=${solr_query["q"]}&fq=${solr_query["fq"]}&sort=retweet_count+desc&rows=${solr_query["rows"]}&start=${solr_query["start"]}">Retweets count</a></li>
+                    <li><a href="?query=${solr_query["q"]}&fq=${solr_query["fq"]}&sort=created_at+desc&rows=${solr_query["rows"]}&start=${solr_query["start"]}">${_('Date')}</a></li>
+                    <li><a href="?query=${solr_query["q"]}&fq=${solr_query["fq"]}&sort=retweet_count+desc&rows=${solr_query["rows"]}&start=${solr_query["start"]}">${_('Retweets count')}</a></li>
                     <li class="divider"></li>
                     <li class="divider"></li>
-                    <li><a href="?query=${solr_query["q"]}&fq=${solr_query["fq"]}&rows=${solr_query["rows"]}&start=${solr_query["start"]}">Reset sorting</a></li>
+                    <li><a href="?query=${solr_query["q"]}&fq=${solr_query["fq"]}&rows=${solr_query["rows"]}&start=${solr_query["start"]}">${_('Reset sorting')}</a></li>
                   </ul>
                   </ul>
                 </div>
                 </div>
             </form>
             </form>
@@ -217,15 +230,15 @@ ${ commonheader(_('Search'), "search", user) }
                         next = int(solr_query["start"]) + int(solr_query["rows"])
                         next = int(solr_query["start"]) + int(solr_query["rows"])
                       %>
                       %>
                       %if int(solr_query["start"]) > 0:
                       %if int(solr_query["start"]) > 0:
-                        <li><a title="Beginning of List" href="?query=${solr_query["q"]}&fq=${solr_query["fq"]}&sort=${solr_query["sort"]}&rows=${solr_query["rows"]}&start=${beginning}">&larr; Beginning of List</a></li>
-                        <li><a title="Previous Page" href="?query=${solr_query["q"]}&fq=${solr_query["fq"]}&sort=${solr_query["sort"]}&rows=${solr_query["rows"]}&start=${previous}">Previous Page</a></li>
+                        <li><a title="${_('Beginning of List')}" href="?query=${solr_query["q"]}&fq=${solr_query["fq"]}&sort=${solr_query["sort"]}&rows=${solr_query["rows"]}&start=${beginning}">&larr; ${_('Beginning of List')}</a></li>
+                        <li><a title="Previous Page" href="?query=${solr_query["q"]}&fq=${solr_query["fq"]}&sort=${solr_query["sort"]}&rows=${solr_query["rows"]}&start=${previous}">${_('Previous Page')}</a></li>
                       %endif
                       %endif
-                      <li><a title="Next page" href="?query=${solr_query["q"]}&fq=${solr_query["fq"]}&sort=${solr_query["sort"]}&rows=${solr_query["rows"]}&start=${next}">Next Page</a></li>
+                      <li><a title="Next page" href="?query=${solr_query["q"]}&fq=${solr_query["fq"]}&sort=${solr_query["sort"]}&rows=${solr_query["rows"]}&start=${next}">${_('Next Page')}</a></li>
                     </ul>
                     </ul>
-                    <p>Show
+                    <p>${_('Show')}
                       <select id="recordsPerPage" class="input-mini"><option value="15">15</option><option value="30">30</option><option value="45">45</option><option value="60">60</option><option value="100">100</option></select>
                       <select id="recordsPerPage" class="input-mini"><option value="15">15</option><option value="30">30</option><option value="45">45</option><option value="60">60</option><option value="100">100</option></select>
-                      tweets per page.
-                      Showing ${int(solr_query["start"])+1} to ${int(solr_query["start"])+int(solr_query["rows"])} of ${ response['response']['numFound'] } tweets
+                      ${_('tweets per page.')}
+                      ${_('Showing %s to %s of %s tweets') % (int(solr_query["start"])+1, int(solr_query["start"])+int(solr_query["rows"]), response['response']['numFound'])}
                     </p>
                     </p>
                   </div>
                   </div>
             % endif
             % endif

+ 3 - 3
apps/search/src/search/templates/macros.mako

@@ -193,7 +193,7 @@ def escape(text)  :
           ${ parseLinks(result.get('text', '')) }
           ${ parseLinks(result.get('text', '')) }
           %if result.get('retweet_count', ''):
           %if result.get('retweet_count', ''):
               <div class="retweeted">
               <div class="retweeted">
-                Retweeted ${ result.get('retweet_count', '') } times
+                ${_('Retweeted %s times') % result.get('retweet_count', '') }
               </div>
               </div>
           %endif
           %endif
         </div>
         </div>
@@ -203,13 +203,13 @@ def escape(text)  :
             <li class="action">
             <li class="action">
               <a href="https://twitter.com/intent/tweet?in_reply_to=${ result.get('id', '') }" target="_blank">
               <a href="https://twitter.com/intent/tweet?in_reply_to=${ result.get('id', '') }" target="_blank">
                 <i class="icon icon-reply"></i>
                 <i class="icon icon-reply"></i>
-                <b>Reply</b>
+                <b>${_('Reply')}</b>
               </a>
               </a>
             </li>
             </li>
             <li class="action">
             <li class="action">
               <a href="https://twitter.com/intent/retweet?tweet_id=${ result.get('id', '') }" target="_blank">
               <a href="https://twitter.com/intent/retweet?tweet_id=${ result.get('id', '') }" target="_blank">
                 <i class="icon icon-retweet"></i>
                 <i class="icon icon-retweet"></i>
-                <b>Retweet</b>
+                <b>${_('Retweet')}</b>
               </a>
               </a>
             </li>
             </li>
           </ul>
           </ul>

+ 32 - 25
apps/search/src/search/views.py

@@ -45,6 +45,7 @@ def index(request):
     solr_query['sort'] = search_form.cleaned_data['sort']
     solr_query['sort'] = search_form.cleaned_data['sort']
     solr_query['rows'] = search_form.cleaned_data['rows'] or 15
     solr_query['rows'] = search_form.cleaned_data['rows'] or 15
     solr_query['start'] = search_form.cleaned_data['start'] or 0
     solr_query['start'] = search_form.cleaned_data['start'] or 0
+    solr_query['facets'] = search_form.cleaned_data['facets'] or 1
     response = SolrApi(SOLR_URL).query(solr_query)
     response = SolrApi(SOLR_URL).query(solr_query)
     response = json.loads(response)
     response = json.loads(response)
 
 
@@ -59,31 +60,37 @@ class SolrApi(object):
 
 
   def query(self, solr_query):
   def query(self, solr_query):
     try:
     try:
-      return self._root.get('collection1/browse', (('q', solr_query['q']),
-                                                   ('fq', solr_query['fq']),
-                                                   ('wt', 'json'),
-                                                   ('sort', solr_query['sort']),
-                                                   ('rows', solr_query['rows']),
-                                                   ('start', solr_query['start']),
-
-                                                   ('facet', 'true'),
-                                                   ('facet.limit', 10),
-                                                   ('facet.mincount', 1),
-                                                   ('facet.sort', 'count'),                                                   
-
-                                                   ('facet.field', 'user_location'),
-                                                   ('facet.field', 'user_statuses_count'),
-                                                   ('facet.field', 'user_followers_count'),
-
-                                                   ('facet.range', 'retweet_count'),
-                                                   ('f.retweet_count.facet.range.start', '0'),
-                                                   ('f.retweet_count.facet.range.end', '100'),
-                                                   ('f.retweet_count.facet.range.gap', '10'),
-
-                                                   ('facet.date', 'created_at'),
-                                                   ('facet.date.start', 'NOW/DAY-305DAYS'),
-                                                   ('facet.date.end', 'NOW/DAY+1DAY'),
-                                                   ('facet.date.gap', '+1DAY')))
+      params = (('q', solr_query['q']),
+                ('wt', 'json'),
+                ('sort', solr_query['sort']),
+                ('rows', solr_query['rows']),
+                ('start', solr_query['start']),
+
+                ('facet', 'true' if solr_query['facets'] == 1 else 'false'),
+                ('facet.limit', 10),
+                ('facet.mincount', 1),
+                ('facet.sort', 'count'),
+
+                ('facet.field', 'user_location'),
+                ('facet.field', 'user_statuses_count'),
+                ('facet.field', 'user_followers_count'),
+
+                ('facet.range', 'retweet_count'),
+                ('f.retweet_count.facet.range.start', '0'),
+                ('f.retweet_count.facet.range.end', '100'),
+                ('f.retweet_count.facet.range.gap', '10'),
+
+                ('facet.date', 'created_at'),
+                ('facet.date.start', 'NOW/DAY-305DAYS'),
+                ('facet.date.end', 'NOW/DAY+1DAY'),
+                ('facet.date.gap', '+1DAY'),)
+
+      fqs = solr_query['fq'].split('|')
+      for fq in fqs:
+        if fq:
+          params += (('fq', fq),)
+
+      return self._root.get('collection1/browse', params)
     except RestException, e:
     except RestException, e:
       print e
       print e
       return '{"responseHeader":{"status":0,"QTime":1,"params":{"wt":"json"}},"response":{"numFound":0,"start":0,"maxScore":0.0,"docs":[]},"highlighting":{}}'
       return '{"responseHeader":{"status":0,"QTime":1,"params":{"wt":"json"}},"response":{"numFound":0,"start":0,"maxScore":0.0,"docs":[]},"highlighting":{}}'