@@ -38,17 +38,14 @@ def default_request_params():
40# create a callback wrapper for the search engine results
40# create a callback wrapper for the search engine results
41−def make_callback(engine_name, results, suggestions, callback, params):
41+def make_callback(engine_name, results, suggestions, answers, infoboxes, callback, params):
43 # creating a callback wrapper for the search engine results
43 # creating a callback wrapper for the search engine results
44 def process_callback(response, **kwargs):
44 def process_callback(response, **kwargs):
45 cb_res = []
45 cb_res = []
46 response.search_params = params
46 response.search_params = params
48− # update stats with current page-load-time
48+ # callback
49− engines[engine_name].stats['page_load_time'] += \
50− (datetime.now() - params['started']).total_seconds()
53 search_results = callback(response)
50 search_results = callback(response)
54 except Exception, e:
51 except Exception, e:
@@ -61,6 +58,7 @@ def make_callback(engine_name, results, suggestions, callback, params):
61 engine_name, str(e))
58 engine_name, str(e))
64 for result in search_results:
62 for result in search_results:
65 result['engine'] = engine_name
63 result['engine'] = engine_name
@@ -70,21 +68,38 @@ def make_callback(engine_name, results, suggestions, callback, params):
70 suggestions.add(result['suggestion'])
68 suggestions.add(result['suggestion'])
71+ # if it is an answer, add it to list of answers
72+ if 'answer' in result:
73+ answers.add(result['answer'])
76+ # if it is an infobox, add it to list of infoboxes
77+ if 'infobox' in result:
78+ infoboxes.append(result)
73 # append result
82 # append result
74 cb_res.append(result)
83 cb_res.append(result)
76 results[engine_name] = cb_res
85 results[engine_name] = cb_res
87+ # update stats with current page-load-time
88+ engines[engine_name].stats['page_load_time'] += \
89+ (datetime.now() - params['started']).total_seconds()
78 return process_callback
91 return process_callback
80# return the meaningful length of the content for a result
94# return the meaningful length of the content for a result
81−def content_result_len(result):
95+def content_result_len(content):
82− if isinstance(result.get('content'), basestring):
96+ if isinstance(content, basestring):
83− content = re.sub('[,;:!?\./\\\\ ()-_]', '', result.get('content'))
97+ content = re.sub('[,;:!?\./\\\\ ()-_]', '', content)
84 return len(content)
98 return len(content)
88# score results and remove duplications
103# score results and remove duplications
89def score_results(results):
104def score_results(results):
90 # calculate scoring parameters
105 # calculate scoring parameters
@@ -138,7 +153,7 @@ def score_results(results):
138 # merge duplicates together
153 # merge duplicates together
139 if duplicated:
154 if duplicated:
140 # using content with more text
155 # using content with more text
141− if content_result_len(res) > content_result_len(duplicated):
156+ if content_result_len(res.get('content', '')) > content_result_len(duplicated.get('content', '')):
142 duplicated['content'] = res['content']
157 duplicated['content'] = res['content']
144 # increase result-score
159 # increase result-score
@@ -197,6 +212,64 @@ def score_results(results):
197 return gresults
212 return gresults
215+def merge_two_infoboxes(infobox1, infobox2):
216+ if 'urls' in infobox2:
217+ urls1 = infobox1.get('urls', None)
220+ infobox1.set('urls', urls1)
223+ for url in infobox1.get('urls', []):
224+ urlSet.add(url.get('url', None))
226+ for url in infobox2.get('urls', []):
227+ if url.get('url', None) not in urlSet:
230+ if 'attributes' in infobox2:
231+ attributes1 = infobox1.get('attributes', None)
232+ if attributes1 == None:
234+ infobox1.set('attributes', attributes1)
236+ attributeSet = set()
237+ for attribute in infobox1.get('attributes', []):
238+ if attribute.get('label', None) not in attributeSet:
239+ attributeSet.add(attribute.get('label', None))
241+ for attribute in infobox2.get('attributes', []):
242+ attributes1.append(attribute)
244+ if 'content' in infobox2:
245+ content1 = infobox1.get('content', None)
246+ content2 = infobox2.get('content', '')
247+ if content1 != None:
248+ if content_result_len(content2) > content_result_len(content1):
249+ infobox1['content'] = content2
251+ infobox1.set('content', content2)
254+def merge_infoboxes(infoboxes):
257+ for infobox in infoboxes:
259+ infobox_id = infobox.get('id', None)
260+ if infobox_id != None:
261+ existingIndex = infoboxes_id.get(infobox_id, None)
262+ if existingIndex != None:
263+ merge_two_infoboxes(results[existingIndex], infobox)
267+ results.append(infobox)
268+ infoboxes_id[infobox_id] = len(results)-1
200class Search(object):
273class Search(object):
202 """Search information container"""
275 """Search information container"""
@@ -219,6 +292,8 @@ class Search(object):
220 self.results = []
293 self.results = []
221 self.suggestions = []
294 self.suggestions = []
222 self.request_data = {}
297 self.request_data = {}
224 # set specific language if set
299 # set specific language if set
@@ -350,6 +425,8 @@ class Search(object):
350 requests = []
425 requests = []
351 results = {}
426 results = {}
352 suggestions = set()
427 suggestions = set()
354 # increase number of searches
431 # increase number of searches
355 number_of_searches += 1
432 number_of_searches += 1
@@ -394,6 +471,8 @@ class Search(object):
394 selected_engine['name'],
471 selected_engine['name'],
396 suggestions,
473 suggestions,
397 engine.response,
476 engine.response,
398 request_params
477 request_params
@@ -431,11 +510,14 @@ class Search(object):
431 # score results and remove duplications
510 # score results and remove duplications
432 results = score_results(results)
511 results = score_results(results)
513+ # merge infoboxes according to their ids
514+ infoboxes = merge_infoboxes(infoboxes)
434 # update engine stats, using calculated score
516 # update engine stats, using calculated score
435 for result in results:
517 for result in results:
436 for res_engine in result['engines']:
518 for res_engine in result['engines']:
437 engines[result['engine']]\
519 engines[result['engine']]\
438 .stats['score_count'] += result['score']
520 .stats['score_count'] += result['score']
440− # return results and suggestions
522+ # return results, suggestions, answers and infoboxes
441− return results, suggestions
523+ return results, suggestions, answers, infoboxes