def suggest(self, model_clz, query, limit=10, offset=0, order=None, ascending=True): """ Suggest terms that would possibly yield more relevant results for the given query. """ self.database.reopen() enq = Enquire(self.database) enq.set_collapse_key(DOC_ITEM_ID) if order is not None: if issubclass(type(order), basestring): order = self.sort_names.index(order) if order == -1: raise TypeError("There is no sort name %s" % order) enq.set_sort_by_value(order, ascending) else: enq.set_sort_by_relevance() query_parser = self._query_parser() query = query_parser.parse_query(query) query = self._add_model_query(query,model_clz) log.debug(query) enq.set_query(query) mset = enq.get_mset(offset, limit) rset = RSet() for m in mset: rset.add_document(m[MSET_DID]) eset = enq.get_eset(limit, rset) for item in eset.items: yield (item[0].decode('utf8'), item[1])
def estimate(self, model_clz, query, limit=10, partial=False): """ Estimate the number of documents that will be yielded with the given query. limit tells the estimator the minimum number of documents to consider. """ self.database.reopen() enq = Enquire(self.database) enq.set_collapse_key(DOC_ITEM_ID) query, query_parser = self._parse_query(query, partial=partial) query = self._add_model_query(query,model_clz) log.debug(query) enq.set_query(query) return enq.get_mset(0, 0, limit).get_matches_estimated()
def morelike(self, model_clz, query, select=["*"], limit=10, offset=0, order=None, ascending=True): """ Find documents in the database most relevant to the given terms. 'select' - The set of keys from the documents picked data dictionary to return or use to construct a record. '*' means all available keys. 'limit' - The number of records to return. 'offset' - How many records to skip before returning. 'order' - The number or name (if order_names was provided to the constructor) of the column to sort the results by. 'ascending' - Whether to sort the results in ascending or descending order. """ self.database.reopen() suggested_terms = self.suggest(model_clz, query, limit, offset, order, ascending) terms = [term[0] for term in suggested_terms] enq = Enquire(self.database) enq.set_collapse_key(DOC_ITEM_ID) if order is not None: if issubclass(type(order), basestring): order = self.sort_names.index(order) if order == -1: raise TypeError("There is no sort name %s" % order) enq.set_sort_by_value(order, ascending) else: enq.set_sort_by_relevance() query = Query(Query.OP_ELITE_SET, terms, limit) query = self._add_model_query(query,model_clz) enq.set_query(query) mset = enq.get_mset(offset, limit) return self._generate_records(mset, select)
def select(self, model_clz, query, select=set(["*"]), limit=10, offset=0, order=None, ascending=True, partial=False): """Select documents from the database matching 'query'. 'select' - The set of keys from the documents picked data dictionary to return or use to construct a record. '*' means all available keys. 'limit' - The number of records to return. 'offset' - How many records to skip before returning. 'order' - The number or name (if order_names was provided to the constructor) of the column to sort the results by. 'ascending' - Whether to sort the results in ascending or descending order. 'partial' - Wether to support wildcard partial queries like "foo*". """ self.database.reopen() enq = Enquire(self.database) enq.set_collapse_key(DOC_ITEM_ID) if order is not None: if issubclass(type(order), basestring): order = self.sort_names.index(order) if order == -1: raise TypeError("There is no sort name %s" % order) enq.set_sort_by_value(order, ascending) else: enq.set_sort_by_relevance() query, query_parser = self._parse_query(query, partial=partial) query = self._add_model_query(query,model_clz) log.debug(query) enq.set_query(query) mset = enq.get_mset(offset, limit) return self._generate_records(mset, select)