diff options
Diffstat (limited to 'searx/search.py')
| -rw-r--r-- | searx/search.py | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/searx/search.py b/searx/search.py index d2a9dd42f..c861a795a 100644 --- a/searx/search.py +++ b/searx/search.py @@ -59,7 +59,7 @@ def make_callback(engine_name, results, suggestions, callback, params): print '[E] Error with engine "{0}":\n\t{1}'.format( engine_name, str(e)) return - + for result in search_results: result['engine'] = engine_name @@ -87,7 +87,7 @@ def score_results(results): results = [] - # deduplication + scoring + # pass 1: deduplication + scoring for i, res in enumerate(flat_res): res['parsed_url'] = urlparse(res['url']) @@ -147,8 +147,42 @@ def score_results(results): res['score'] = score results.append(res) - # return results sorted by score - return sorted(results, key=itemgetter('score'), reverse=True) + results = sorted(results, key=itemgetter('score'), reverse=True) + + # pass 2 : group results by category and template + gresults = [] + categoryPositions = {} + + for i, res in enumerate(results): + # FIXME : handle more than one category per engine + category = engines[res['engine']].categories[0] + ':' + '' if 'template' not in res else res['template'] + + current = None if category not in categoryPositions else categoryPositions[category] + + # group with previous results using the same category if the group can accept more result and is not too far from the current position + if current != None and (current['count'] > 0) and (len(gresults) - current['index'] < 20): + # group with the previous results using the same category with this one + index = current['index'] + gresults.insert(index, res) + + # update every index after the current one (including the current one) + for k in categoryPositions: + v = categoryPositions[k]['index'] + if v >= index: + categoryPositions[k]['index'] = v+1 + + # update this category + current['count'] -= 1 + + else: + # same category + gresults.append(res) + + # update categoryIndex + categoryPositions[category] = { 'index' : len(gresults), 'count' : 8 } + + # return gresults + return gresults class Search(object): |