Merge pull request #420 from martenson/ts-search-adjustments

allow setting of page_size in the ts search request
This commit is contained in:
John Chilton
2015-07-04 07:51:06 -05:00
4 changed files with 26 additions and 15 deletions
@@ -330,6 +330,9 @@ class RepositoriesController( BaseAPIController ):
:param page: (optional)requested page of the search
:type page: int
:param page_size: (optional)requested page_size of the search
:type page_size: int
:param jsonp: (optional)flag whether to use jsonp format response, defaults to False
:type jsonp: bool
@@ -357,13 +360,15 @@ class RepositoriesController( BaseAPIController ):
q = kwd.get( 'q', '' )
if q:
page = kwd.get( 'page', 1 )
page_size = kwd.get( 'page_size', 10 )
try:
page = int( page )
page_size = int( page_size )
except ValueError:
raise RequestParameterInvalidException( 'The "page" requested has to be an integer.' )
raise RequestParameterInvalidException( 'The "page" and "page_size" parameters have to be integers.' )
return_jsonp = util.asbool( kwd.get( 'jsonp', False ) )
callback = kwd.get( 'callback', 'callback' )
search_results = self._search( trans, q, page )
search_results = self._search( trans, q, page, page_size )
if return_jsonp:
response = str( '%s(%s);' % ( callback, json.dumps( search_results ) ) )
else:
@@ -387,7 +392,7 @@ class RepositoriesController( BaseAPIController ):
repository_dicts.append( repository_dict )
return json.dumps( repository_dicts )
def _search( self, trans, q, page=1 ):
def _search( self, trans, q, page=1, page_size=10 ):
"""
Perform the search over TS repositories.
Note that search works over the Whoosh index which you have
@@ -422,6 +427,7 @@ class RepositoriesController( BaseAPIController ):
results = repo_search.search( trans,
search_term,
page,
page_size,
boosts )
results[ 'hostname' ] = web.url_for( '/', qualified = True )
return results
+9 -3
View File
@@ -28,6 +28,9 @@ class ToolsController( BaseAPIController ):
:param page: (optional)requested page of the search
:type page: int
:param page_size: (optional)requested page_size of the search
:type page_size: int
:param jsonp: (optional)flag whether to use jsonp format response, defaults to False
:type jsonp: bool
@@ -46,20 +49,22 @@ class ToolsController( BaseAPIController ):
raise NotImplemented( 'Listing of all the tools is not implemented. Provide parameter "q" to search instead.' )
else:
page = kwd.get( 'page', 1 )
page_size = kwd.get( 'page_size', 10 )
try:
page = int( page )
page_size = int ( page_size )
except ValueError:
raise RequestParameterInvalidException( 'The "page" requested has to be an integer.' )
raise RequestParameterInvalidException( 'The "page" and "page_size" have to be integers.' )
return_jsonp = util.asbool( kwd.get( 'jsonp', False ) )
callback = kwd.get( 'callback', 'callback' )
search_results = self._search( trans, q, page )
search_results = self._search( trans, q, page, page_size )
if return_jsonp:
response = str( '%s(%s);' % ( callback, json.dumps( search_results ) ) )
else:
response = json.dumps( search_results )
return response
def _search( self, trans, q, page=1 ):
def _search( self, trans, q, page=1, page_size=10 ):
"""
Perform the search over TS tools index.
Note that search works over the Whoosh index which you have
@@ -90,6 +95,7 @@ class ToolsController( BaseAPIController ):
results = tool_search.search( trans,
search_term,
page,
page_size,
boosts )
results[ 'hostname' ] = web.url_for( '/', qualified = True )
return results
@@ -37,8 +37,6 @@ class RepoWeighting( scoring.BM25F ):
use_final = True
def final( self, searcher, docnum, score ):
# log.debug('score before: ' + str(score) )
# Arbitrary for now
reasonable_hits = 100.0
@@ -51,21 +49,18 @@ class RepoWeighting( scoring.BM25F ):
if times_downloaded == 0:
times_downloaded = 1
popularity_modifier = ( times_downloaded / reasonable_hits )
# log.debug('popularity_modifier: ' + str(popularity_modifier) )
cert_modifier = 2 if searcher.stored_fields( docnum )[ "approved" ] == 'yes' else 1
# log.debug('cert_modifier: ' + str(cert_modifier) )
# Adjust the computed score for this document by the popularity
# and by the certification level.
final_score = score * popularity_modifier * cert_modifier
# log.debug('score after: ' + str( final_score ) )
return final_score
class RepoSearch( object ):
def search( self, trans, search_term, page, boosts ):
def search( self, trans, search_term, page, page_size, boosts ):
"""
Perform the search on the given search_term
@@ -103,7 +98,7 @@ class RepoSearch( object ):
user_query = parser.parse( '*' + search_term + '*' )
try:
hits = searcher.search_page( user_query, page, pagelen = 10, terms = True )
hits = searcher.search_page( user_query, page, pagelen = page_size, terms = True )
except ValueError:
raise ObjectNotFound( 'The requested page does not exist.' )
@@ -112,6 +107,8 @@ class RepoSearch( object ):
log.debug( 'scored hits: ' + str( hits.scored_length() ) )
results = {}
results[ 'total_results'] = str( len( hits ) )
results[ 'page'] = str( page )
results[ 'page_size'] = str( page_size )
results[ 'hits' ] = []
for hit in hits:
hit_dict = {}
@@ -31,7 +31,7 @@ tool_schema = Schema(
class ToolSearch( object ):
def search( self, trans, search_term, page, boosts ):
def search( self, trans, search_term, page, page_size, boosts ):
"""
Perform the search on the given search_term
@@ -63,7 +63,7 @@ class ToolSearch( object ):
user_query = parser.parse( '*' + search_term + '*' )
try:
hits = searcher.search_page( user_query, page, pagelen = 10, terms = True )
hits = searcher.search_page( user_query, page, pagelen = page_size, terms = True )
except ValueError:
raise ObjectNotFound( 'The requested page does not exist.' )
@@ -72,6 +72,8 @@ class ToolSearch( object ):
log.debug( 'scored hits: ' + str( hits.scored_length() ) )
results = {}
results[ 'total_results'] = str( len( hits ) )
results[ 'page'] = str( page )
results[ 'page_size'] = str( page_size )
results[ 'hits' ] = []
for hit in hits:
hit_dict = {}