Beispiel #1
0
    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])
Beispiel #2
0
    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)
Beispiel #3
0
    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)