def search(self, query, limit=20): """Search in solr (if the solr feature is enabled) but then convert solr results to brains and continue working with them. Brains are obtained using path/rid which is expected to be performant enough. Search results are usually limited to 10. """ if not is_solr_feature_enabled(): for each in super(SolrObjPathSource, self).search(query, limit=limit): yield each return results = self.solr.search( query=make_query(query), filters=self.make_solr_filters(self.selectable_filter.criteria), rows=limit, fl=['path'], ) from opengever.base.solr import OGSolrContentListing # XXX: FIXME! for solr_doc in OGSolrContentListing(results): brain = self._getBrainByToken(solr_doc.getPath()) if brain: yield self.getTermByBrain(brain, real_value=False)
def test_query_with_local_parameters(self): self.settings.local_query_parameters = ( u'{!boost b=recip(ms(NOW,modified),3.858e-10,10,1)}') self.assertEqual( make_query('foo'), u'{!boost b=recip(ms(NOW,modified),3.858e-10,10,1)}' u'Title:foo^10 OR SearchableText:foo OR SearchableText:foo*')
def solr_results(self, query=None, batch=True, b_size=10, b_start=0): searchable_text = self.request.form.get('SearchableText', '') if searchable_text: query = make_query(searchable_text) else: query = u'*:*' filters = self.solr_filters() if 'trashed' not in self.request.form: filters.append(u'trashed:false') params = { 'fl': [ 'UID', 'Title', 'getIcon', 'portal_type', 'path', 'containing_dossier', 'id', 'created', 'modified', 'review_state', 'bumblebee_checksum', ], 'hl': 'on', 'hl.fl': 'SearchableText', 'hl.snippets': 3, } solr = getUtility(ISolrSearch) resp = solr.search( query=query, filters=filters, start=b_start, rows=b_size, sort=self.solr_sort(), **params) results = OGSolrContentListing(resp) if batch: results = Batch(results, b_size, b_start) return results
def test_search_word_with_special_chars(self): self.assertEqual( make_query('C++'), u'(Title:"C\\+\\+"^20 OR SearchableText:"C\\+\\+"^5 OR ' u'SearchableText:"C\\+\\+*"^2) OR ' u'(Title:C\\+\\+^10 OR SearchableText:C\\+\\+ OR ' u'SearchableText:C\\+\\+*)')
def test_multiple_search_words(self): self.assertEqual( make_query('foo bar baz'), u'(Title:"foo bar baz"^20 OR SearchableText:"foo bar baz"^5 OR ' u'SearchableText:"foo bar baz*"^2) OR (' u'(Title:foo^10 OR SearchableText:foo OR SearchableText:foo*) AND ' u'(Title:bar^10 OR SearchableText:bar OR SearchableText:bar*) AND ' u'(Title:baz^10 OR SearchableText:baz OR SearchableText:baz*))')
def test_long_phrase_gets_truncated_to_10_terms(self): self.settings.simple_search_term_pattern = u'Title:{term}' self.settings.simple_search_phrase_pattern = u'Title:"{phrase}"' self.assertEqual( make_query( 'one two three four five six seven eight nine ten eleven'), u'(Title:"one two three four five six seven eight nine ten ' u'eleven") OR ((Title:one) AND (Title:two) AND (Title:three) AND ' u'(Title:four) AND (Title:five) AND (Title:six) AND (Title:seven) ' u'AND (Title:eight) AND (Title:nine) AND (Title:ten))')
def results(self): if not self.search_term: return [] solr = getUtility(ISolrSearch) query = make_query(self.search_term) filters = [u'trashed:false'] if self.path: filters.append(u'path_parent:%s' % escape(self.path)) params = { 'fl': [ 'UID', 'id', 'Title', 'getIcon', 'portal_type', 'path', ], } resp = solr.search( query=query, filters=filters, rows=self.limit, **params) return resp
def results(self): if not self.search_term: return [] solr = getUtility(ISolrSearch) query = make_query(self.search_term) filters = [u'trashed:false'] if self.path: filters.append(u'path_parent:%s' % escape(self.path)) params = { 'fl': [ 'UID', 'id', 'Title', 'getIcon', 'portal_type', 'path', 'Description', 'filename' ], } resp = solr.search(query=query, filters=filters, rows=self.limit, **params) return resp
def make_solr_query(self): params = self.request.form.copy() if 'q' in params: query = make_query(params['q']) del params['q'] elif 'q.raw' in params: query = params['q.raw'] del params['q.raw'] else: query = '*:*' if 'fq' in params: filters = params['fq'] del params['fq'] else: filters = [] if 'start' in params: start = safe_int(params['start']) del params['start'] else: start = 0 if 'rows' in params: rows = min(safe_int(params['rows'], 25), 1000) del params['rows'] else: rows = 25 if 'sort' in params: sort = params['sort'] del params['sort'] else: if query == '*:*': sort = None else: sort = 'score asc' return query, filters, start, rows, sort, params
def test_search_words_with_binary_operator(self): self.assertEqual( make_query('foo AND bar'), u'Title:(foo AND bar)^10 OR SearchableText:(foo AND bar)')
def test_single_search_word(self): self.assertEqual( make_query('foo'), u'Title:foo^10 OR SearchableText:foo OR SearchableText:foo*')
def test_query_string_is_unicode(self): self.assertTrue(isinstance(make_query('über'), unicode)) self.assertTrue(isinstance(make_query(u'über'), unicode))