Sorry, there's a minor error in my JSON - the "arg" key in the last phase should be quoted.
2011/9/12 Sean Cribbs <s...@basho.com> > Pagination can be non-trivial, but this feels like a good fit for secondary > indexes rather than Search. Note that secondary indexes are only available > in 1.0 (you can get a prerelease package from downloads.basho.com). > > I'd start off with a reduce phase that handles the pagination (since you > know it's by key, it's easy to do up front), then you can add a map to fetch > the documents and a final reduce/sort to make sure they are in the original > order. This isn't exact because I don't know your document structure, but > here's how you might do that: > > { > "inputs": { > "bucket": "order", > "index": "contact_email_bin", > "key": "firstname.lastn...@company.com" > }, > "query":[ > > {"reduce":{"language":"erlang","module":"riak_kv_mapreduce","function":"reduce_identity"}}, > {"reduce":{"language":"javascript", "name":"paginateOrders", "arg": > 1}}, > {"map":{"language":"javascript", "name":"Riak.mapValuesJson"}}, > {"reduce":{"language":"javascript", "name":"Riak.reduceSort", > "keep":true, arg:"function(a,b){ return a.Order.OrderNumber > > b.Order.OrderNumber; }"}} > ] > } > > The first reduce makes sure the keys emitted can be passed to the > pagination function in Javascript. If you are using Erlang for the function, > you might not need this. Your paginateOrders function (assuming stored as a > built-in) would look like this: > > function(values, page){ > // Set the page size here, or possibly set as an argument > var pageSize = 30; > // Sort on the key, descending. > values = values.sort(function(a,b){ return parseInt(a[1]) < > parseInt(b[1]); }); > return values.slice((page - 1) * pageSize, page * pageSize); > } > > Note the Riak.reduceSort function can take a comparator function as a > string arg and will evaluate it and pass it to the Array.sort function. > > 2011/9/12 Fredrik Lindström <fredrik.lindst...@qbranch.se> > >> Hi Sean, >> thank you for the clarification. In our scenario a user might have many >> orders so it would be nice to be able to page through the result set in >> descending order. >> Since our OrderNumbers are guaranteed to be unique we are currently using >> them as the keys in Riak. They numbers are also created sequentially, hence >> the desire to page through them in descending order giving the user a >> chronological perspective of placed orders. >> >> We're still quite early in the process of evaluating Riak for our project >> so we have plenty of time to try other approaches. >> >> /F >> ------------------------------ >> *From:* Sean Cribbs [s...@basho.com] >> *Sent:* Monday, September 12, 2011 3:53 PM >> *To:* Fredrik Lindström >> *Cc:* riak-users@lists.basho.com >> *Subject:* Re: riaksearch 0.14.2 via solr: sort desc >> >> Fredrik, >> >> Unfortunately, because of limitations in Riak Search 0.14.x, it can only >> (pre-)sort reliably on the document ID. However, it seems like OrderNumber >> might be a natural ID for this document? If so, you could do something like >> the following: >> >> http://riak/solr/order/select?rows=1&presort=key&q= >> Order_Contact_Email:firstname.lastn...@company.com >> >> However, this query will also return in ascending order. If you just want >> the highest order number, then feeding this query to MapReduce and >> processing it there would seem appropriate. >> >> 2011/9/12 Fredrik Lindström <fredrik.lindst...@qbranch.se> >> >>> Hi everyone, >>> does the "sort=myfieldname desc" parameter in riaksearch 0.14.2 (via >>> solr) only sort within the current result set dictated by rows=x and start >>> =y? >>> >>> I can get my search results in the correct ASC order regardless of the >>> rows and start parameters. >>> Sorting in DESC with rows=1 and start=0 I get one (obviously) result but >>> the result actually appears to be in ASC order. The doc returned in the >>> search result is the one with the lowest integer value in the field used for >>> sorting. >>> >>> I'm quite new to Riak and Riak Search and therefore I assume that the >>> error is on my part. >>> >>> Some technical details: >>> >>> Total objects in "order" bucket: 187 >>> >>> Query with DESC sort: >>> >>> http://riak/solr/order/select?rows=1&start=0&sort=Order_OrderNumber%20desc&q=Order_Contact_Email:firstname.lastn...@company.com >>> Result: 1 doc with Order_OrderNumber = 362982 (Expected result in my >>> world of fantasy would be 621738 which is currently the highest value) >>> >>> Query with ASC sort: >>> >>> http://riak/solr/order/select?rows=1&start=0&sort=Order_OrderNumber%20asc&q=Order_Contact_Email:firstname.lastn...@company.com<http://riak/solr/order/select?rows=1&start=0&sort=Order_OrderNumber%20desc&q=Order_Contact_Email:firstname.lastn...@company.com> >>> Result: 1 doc with Order_OrderNumber = 362982 >>> >>> I have a custom schema where I have defined the field I want to sort by >>> in the following way: >>> {field, [ >>> {name, "Order_OrderNumber"}, >>> {type, integer}, >>> {analyzer_factory, {erlang, text_analyzers, >>> integer_analyzer_factory}} >>> ]}, >>> >>> If I run the DESC query with rows=187 the results are ordered in the >>> correct descending order. >>> >>> /F >>> >>> >>> _______________________________________________ >>> riak-users mailing list >>> riak-users@lists.basho.com >>> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com >>> >>> >> >> >> -- >> Sean Cribbs <s...@basho.com> >> Developer Advocate >> Basho Technologies, Inc. >> http://www.basho.com/ >> >> > > > -- > Sean Cribbs <s...@basho.com> > Developer Advocate > Basho Technologies, Inc. > http://www.basho.com/ > > -- Sean Cribbs <s...@basho.com> Developer Advocate Basho Technologies, Inc. http://www.basho.com/
_______________________________________________ riak-users mailing list riak-users@lists.basho.com http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com