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
Post a Comment