示例#1
0
    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)
示例#2
0
 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*')
示例#3
0
    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
示例#4
0
 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\\+\\+*)')
示例#5
0
 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*))')
示例#6
0
 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))')
示例#7
0
    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
示例#8
0
    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
示例#10
0
 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)')
示例#11
0
 def test_single_search_word(self):
     self.assertEqual(
         make_query('foo'),
         u'Title:foo^10 OR SearchableText:foo OR SearchableText:foo*')
示例#12
0
 def test_query_string_is_unicode(self):
     self.assertTrue(isinstance(make_query('über'), unicode))
     self.assertTrue(isinstance(make_query(u'über'), unicode))