google app engine - How to use cursors for search in gae? -


when rtfm, can't understand how specify paginated searches using technique described in manual. here's code:

def find_documents(query_string, limit, cursor):     try:         subject_desc = search.sortexpression(             expression='date',             direction=search.sortexpression.descending,             default_value=datetime.now().date())          # sort 1000 matching results subject in descending order         sort = search.sortoptions(expressions=[subject_desc], limit=1000)          # set query options         options = search.queryoptions(             limit=limit,  # number of results return             cursor=cursor,             sort_options=sort,             #returned_fields=['author', 'subject', 'summary'],             #snippeted_fields=['content']          )         query = search.query(query_string=query_string, options=options)         index = search.index(name=_index_name)         # execute query         return index.search(query)     except search.error:         logging.exception('search failed')     return none   class mainadvindexedpage(searchbasehandler):     """handles search requests comments."""      def get(self):         """handles request query."""         regionname = 'delhi'         region = region.all().filter('name = ', regionname).get()         uri = urlparse(self.request.uri)         query = ''         if uri.query:             query = parse_qs(uri.query)             query = query['query'][0]          results = find_documents(query, 50, search.cursor())         next_cursor = results.cursor         template_values = {             'results': results,'next_cursor':next_cursor,             'number_returned': len(results.results),             'url': url, 'user' : users.get_current_user(),              'url_linktext': url_linktext, 'region' : region, 'city' : '', 'request' : self.request, 'form' : searchform(), 'query' : query         }         self.render_template('indexed.html', template_values) 

the code above works , search doesn't page result. wonder following code in manual:

next_cursor = results.cursor  next_cursor_urlsafe = next_cursor.web_safe_string # save next_cursor_urlsafe ... # restore next_cursor_urlsafe  results = find_documents(query_string, 20,                          search.cursor(web_safe_string=next_cursor_urlsafe)) 

what next_cursor used for? how save , purpose of saving? how cursor in first place? should code instead, using memcache save restore cursor?

class mainadvindexedpage(searchbasehandler):     """handles search requests comments."""      def get(self):         """handles request query."""         regionname = 'delhi'         region = region.all().filter('name = ', regionname).get()         uri = urlparse(self.request.uri)         query = ''         if uri.query:             query = parse_qs(uri.query)             query = query['query'][0]         # restore next_cursor_urlsafe         next_cursor_urlsafe = memcache.get('results_cursor')         if last_cursor:             results = find_documents(query_string, 50,                          search.cursor(web_safe_string=next_cursor_urlsafe))     results = find_documents(query, 50, search.cursor())         next_cursor = results.cursor             next_cursor_urlsafe = next_cursor.web_safe_string         # save next_cursor_urlsafe         memcache.set('results_cursor', results.cursor)         template_values = {             'results': results,'next_cursor':next_cursor,             'number_returned': len(results.results),             'url': url, 'user' : users.get_current_user(),              'url_linktext': url_linktext, 'region' : region, 'city' : '', 'request' : self.request, 'form' : searchform(), 'query' : query         }         self.render_template('indexed.html', template_values) 

update

from see answer, i'm supposed use http query string save cursor still don't know how. please tell me how.

update 2

this new effort.

 def get(self):     """handles request query."""     regionname = 'delhi'     region = region.all().filter('name = ', regionname).get()      cursor = self.request.get("cursor")      uri = urlparse(self.request.uri)     query = ''     if uri.query:         query = parse_qs(uri.query)         query = query['query'][0]     logging.info('search cursor: %s', search.cursor())      if cursor:          results = find_documents(query, 50, cursor)     else:        results = find_documents(query, 50, search.cursor())     next_cursor = none     if results , results.cursor:         next_cursor = results.cursor.web_safe_string     logging.info('next cursor: %s', str(next_cursor))     template_values = {         'results': results,'cursor':next_cursor,         'number_returned': len(results.results),         'user' : users.get_current_user(),          'region' : region, 'city' : '', 'request' : self.request, 'form' : searchform(), 'query' : query     } 

i think i've understood how it's supposed work above, , it's outputting cursor @ first hit can know how cursor in first place. documented enough. error message: cursor must cursor, got unicode

no, should not use memcache that, constant key 'results_cursor' - mean users same cursor, bad.

you passing cursor template context (although should converting web_safe_string in second example). in template, should ensure cursor string included in parameters of "next" button: then, in view, should extract there , pass find_documents call.

apart memcache issue, you're there second example, should ensure second call find_documents inside else block doesn't overwrite cursor version.


Comments

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

delphi - Dynamic file type icon -