Beispiel #1
0
    def do_search(self):
        if self.is_evaluated:
            return

        body = self.make_search_body()
        if self.facets_fields:
            aggs = dict([
                (field, {'terms':
                        {'field': field}})
                for field in self.facets_fields
            ])
            if self.facets_limit:
                aggs[field]['terms']['size'] = self.facets_limit

            if self.global_facets:
                aggs = {'global_count': {'global': {}, 'aggs': aggs}}

            body['aggs'] = aggs

        if self.suggest_fields:
            suggest = {}
            for field_name in self.suggest_fields:
                suggest[field_name] = {"text": self._query,
                                       "term": {"field": field_name}}
                if self.suggest_limit:
                    suggest[field_name]["term"]["size"] = self.suggest_limit
            body['suggest'] = suggest

        if self.ordering:
            body['sort'] = [{f: "asc"} if f[0] != '-' else {f[1:]: "desc"}
                            for f in self.ordering] + ["_score"]

        search_params = {
            'index': self.index,
            'doc_type': self.doc_type
        }
        if self._start:
            search_params['from'] = self._start
        if self._stop:
            search_params['size'] = self._stop - self._start

        if self.extra_body:
            body.update(self.extra_body)
        search_params['body'] = body
        self._body = body

        if self.mode == self.MODE_MLT:
            # change include's defaults to False
            search_params['include'] = self.mlt_kwargs.pop('include', False)
            # update search params names
            search_params.update(self.mlt_kwargs)
            for param in ['type', 'indices', 'types', 'scroll', 'size', 'from']:
                if param in search_params:
                    search_params['search_{0}'.format(param)] = search_params.pop(param)
            r = es_client.mlt(**search_params)
        else:
            if 'from' in search_params:
                search_params['from_'] = search_params.pop('from')

            r = es_client.search(**search_params)

        self._response = r
        if self.facets_fields:
            if self.global_facets:
                self._facets = r['aggregations']['global_count']
            else:
                self._facets = r['aggregations']

        self._suggestions = r.get('suggest')
        if self._deserialize:
            self._result_cache = [self.model.es.deserialize(e['_source'])
                                  for e in r['hits']['hits']]
        else:
            self._result_cache = [e['_source'] for e in r['hits']['hits']]
        self._max_score = r['hits']['max_score']

        self._total = r['hits']['total']

        return
    def do_search(self):
        if self.is_evaluated:
            return

        body = self.make_search_body()
        if self.facets_fields:
            aggs = dict([
                (field, {'terms':
                        {'field': field}})
                for field in self.facets_fields
            ])
            if self.facets_limit:
                aggs[field]['terms']['size'] = self.facets_limit

            if self.global_facets:
                aggs = {'global_count': {'global': {}, 'aggs': aggs}}

            body['aggs'] = aggs

        if self.suggest_fields:
            suggest = {}
            for field_name in self.suggest_fields:
                suggest[field_name] = {"text": self._query,
                                       "term": {"field": field_name}}
                if self.suggest_limit:
                    suggest[field_name]["term"]["size"] = self.suggest_limit
            body['suggest'] = suggest

        if self.ordering:
            body['sort'] = [{f: "asc"} if f[0] != '-' else {f[1:]: "desc"}
                            for f in self.ordering] + ["_score"]

        search_params = {
            'index': self.index,
            'doc_type': self.doc_type
        }
        if self._start:
            search_params['from'] = self._start
        if self._stop:
            search_params['size'] = self._stop - self._start

        if self.extra_body:
            body.update(self.extra_body)
        search_params['body'] = body
        self._body = body

        if self.mode == self.MODE_MLT:
            # change include's defaults to False
            search_params['include'] = self.mlt_kwargs.pop('include', False)
            # update search params names
            search_params.update(self.mlt_kwargs)
            for param in ['type', 'indices', 'types', 'scroll', 'size', 'from']:
                if param in search_params:
                    search_params['search_{0}'.format(param)] = search_params.pop(param)
            r = es_client.mlt(**search_params)
        else:
            if 'from' in search_params:
                search_params['from_'] = search_params.pop('from')

            r = es_client.search(**search_params)

        self._response = r
        if self.facets_fields:
            if self.global_facets:
                self._facets = r['aggregations']['global_count']
            else:
                self._facets = r['aggregations']

        self._suggestions = r.get('suggest')
        if self._deserialize:
            self._result_cache = [self.model.es.deserialize(e['_source'])
                                  for e in r['hits']['hits']]
        else:
            self._result_cache = [e['_source'] for e in r['hits']['hits']]
        self._max_score = r['hits']['max_score']

        self._total = r['hits']['total']

        return
Beispiel #3
0
    def do_search(self, extra_body=None):
        if self.is_evaluated:
            return self._result_cache
        print "do_search"
        body = self.make_search_body()

        if self.facets_fields:
            aggs = dict([(field, {
                'terms': {
                    'field': field
                }
            }) for field in self.facets_fields])
            if self.facets_limit:
                aggs[field]['terms']['size'] = self.facets_limit

            if self.global_facets:
                aggs = {'global_count': {'global': {}, 'aggs': aggs}}

            body['aggs'] = aggs

        if self.suggest_fields:
            suggest = {}
            for field_name in self.suggest_fields:
                suggest[field_name] = {
                    "text": self._query,
                    "term": {
                        "field": field_name
                    }
                }
                if self.suggest_limit:
                    suggest[field_name]["text"]["term"][
                        "size"] = self.suggest_limit
            body['suggest'] = suggest

        if self.ordering:
            if not len(body.get('sort', [])):
                body['sort'] = []
            body['sort'].extend([{
                f: "asc"
            } if f[0] != '-' else {
                f[1:]: "desc"
            } for f in self.ordering] + ["_score"])

        search_params = {'index': self.index, 'doc_type': self.doc_type}
        if self._start:
            search_params['from'] = self._start
        if self._stop:
            search_params['size'] = self._stop - self._start

        search_params['body'] = body
        self._body = body
        # print search_params
        # print body

        if self.mode == self.MODE_MLT:
            # change include's defaults to False
            # search_params['include'] = self.mlt_kwargs.pop('include', False)
            # update search params names
            for param in [
                    'type', 'indices', 'types', 'scroll', 'size', 'from'
            ]:
                if param in search_params:
                    search_params['search_{0}'.format(
                        param)] = search_params.pop(param)
            search_params.update(self.mlt_kwargs)
            r = es_client.mlt(**search_params)
        else:
            if 'from' in search_params:
                search_params['from_'] = search_params.pop('from')
            r = es_client.search(**search_params)

        self._response = r
        if self.facets_fields:
            if self.global_facets:
                try:
                    self._facets = r['aggregations']['global_count']
                except KeyError:
                    self._facets = {}
            else:
                self._facets = r['aggregations']

        self._suggestions = r.get('suggest')
        if self.lat is not None and self.lng is not None:
            for e in r['hits']['hits']:
                e['_source']['distance'] = haversine(self.lng, self.lat,
                                                     e['_source']['lng'],
                                                     e['_source']['lat'])
        self._result_cache = [e['_source'] for e in r['hits']['hits']]
        self._max_score = r['hits']['max_score']
        self._total = r['hits']['total']
        return self
Beispiel #4
0
    def do_search(self, extra_body=None):
        if self.is_evaluated:
            return self._result_cache

        body = self.make_search_body()

        if self.facets_fields:
            aggs = dict([(field, {"terms": {"field": field}}) for field in self.facets_fields])
            if self.facets_limit:
                aggs[field]["terms"]["size"] = self.facets_limit

            if self.global_facets:
                aggs = {"global_count": {"global": {}, "aggs": aggs}}

            body["aggs"] = aggs

        if self.suggest_fields:
            suggest = {}
            for field_name in self.suggest_fields:
                suggest[field_name] = {"text": self._query, "term": {"field": field_name}}
                if self.suggest_limit:
                    suggest[field_name]["term"]["size"] = self.suggest_limit
            body["suggest"] = suggest

        if self.ordering:
            body["sort"] = [{f: "asc"} if f[0] != "-" else {f[1:]: "desc"} for f in self.ordering] + ["_score"]

        search_params = {"index": self.index, "doc_type": self.doc_type}
        if self._start:
            search_params["from"] = self._start
        if self._stop:
            search_params["size"] = self._stop - self._start

        search_params["body"] = body
        self._body = body

        if self.mode == self.MODE_MLT:
            # change include's defaults to False
            search_params["include"] = self.mlt_kwargs.pop("include", False)
            # update search params names
            search_params.update(self.mlt_kwargs)
            for param in ["type", "indices", "types", "scroll", "size", "from"]:
                if param in search_params:
                    search_params["search_{0}".format(param)] = search_params.pop(param)
            r = es_client.mlt(**search_params)
        else:
            if "from" in search_params:
                search_params["from_"] = search_params.pop("from")
            r = es_client.search(**search_params)

        self._response = r
        if self.facets_fields:
            if self.global_facets:
                self._facets = r["aggregations"]["global_count"]
            else:
                self._facets = r["aggregations"]

        self._suggestions = r.get("suggest")
        if self._deserialize:
            self._result_cache = [self.model.es.deserialize(e["_source"]) for e in r["hits"]["hits"]]
        else:
            self._result_cache = [e["_source"] for e in r["hits"]["hits"]]
        self._max_score = r["hits"]["max_score"]

        self._total = r["hits"]["total"]
        return self
Beispiel #5
0
    def do_search(self, extra_body=None):
        if self.is_evaluated:
            return self._result_cache
        print "do_search"
        body = self.make_search_body()

        if self.facets_fields:
            aggs = dict([
                (field, {'terms':
                        {'field': field}})
                for field in self.facets_fields
            ])
            if self.facets_limit:
                aggs[field]['terms']['size'] = self.facets_limit

            if self.global_facets:
                aggs = {'global_count': {'global': {}, 'aggs': aggs}}

            body['aggs'] = aggs

        if self.suggest_fields:
            suggest = {}
            for field_name in self.suggest_fields:
                suggest[field_name] = {"text": self._query,
                                       "term": {"field": field_name}}
                if self.suggest_limit:
                    suggest[field_name]["text"]["term"]["size"] = self.suggest_limit
            body['suggest'] = suggest

        if self.ordering:
            if not len(body.get('sort', [])):
              body['sort'] = []
            body['sort'].extend([{f: "asc"} if f[0] != '-' else {f[1:]: "desc"}
                            for f in self.ordering] + ["_score"])


        search_params = {
            'index': self.index,
            'doc_type': self.doc_type
        }
        if self._start:
            search_params['from'] = self._start
        if self._stop:
            search_params['size'] = self._stop - self._start

        search_params['body'] = body
        self._body = body
        # print search_params
        # print body

        if self.mode == self.MODE_MLT:
            # change include's defaults to False
            # search_params['include'] = self.mlt_kwargs.pop('include', False)
            # update search params names
            for param in ['type', 'indices', 'types', 'scroll', 'size', 'from']:
                if param in search_params:
                    search_params['search_{0}'.format(param)] = search_params.pop(param)
            search_params.update(self.mlt_kwargs)
            r = es_client.mlt(**search_params)
        else:
            if 'from' in search_params:
                search_params['from_'] = search_params.pop('from')
            r = es_client.search(**search_params)

        self._response = r
        if self.facets_fields:
            if self.global_facets:
                try:
                    self._facets = r['aggregations']['global_count']
                except KeyError:
                    self._facets = {}
            else:
                self._facets = r['aggregations']

        self._suggestions = r.get('suggest')
        if self.lat is not None and self.lng is not None:
          for e in r['hits']['hits']:
            e['_source']['distance'] = haversine(self.lng, self.lat,
                                                 e['_source']['lng'], e['_source']['lat'])
        self._result_cache = [e['_source'] for e in r['hits']['hits']]
        self._max_score = r['hits']['max_score']
        self._total = r['hits']['total']
        return self