on master help sign in
[enh] engine score stats
e2c1c10asciimoo
searx/engines/__init__.py+14−2
@@ -69,7 +69,7 @@ for section in engines_config.sections():
69 print '[E] Engine config error: Missing attribute "{0}.{1}"'.format(engine.name, engine_attr)
69 print '[E] Engine config error: Missing attribute "{0}.{1}"'.format(engine.name, engine_attr)
70 sys.exit(1)
70 sys.exit(1)
71 engines[engine.name] = engine
71 engines[engine.name] = engine
72− engine.stats = {'result_count': 0, 'search_count': 0, 'page_load_time': 0}
72+ engine.stats = {'result_count': 0, 'search_count': 0, 'page_load_time': 0, 'score_count': 0}
73 if hasattr(engine, 'categories'):
73 if hasattr(engine, 'categories'):
74 for category_name in engine.categories:
74 for category_name in engine.categories:
75 categories.setdefault(category_name, []).append(engine)
75 categories.setdefault(category_name, []).append(engine)
@@ -136,6 +136,7 @@ def search(query, request, selected_categories):
136 for i,res in enumerate(flat_res):
136 for i,res in enumerate(flat_res):
137 res['parsed_url'] = urlparse(res['url'])
137 res['parsed_url'] = urlparse(res['url'])
138 score = (flat_len - i)*settings.weights.get(res['engine'], 1)
138 score = (flat_len - i)*settings.weights.get(res['engine'], 1)
139+ engines[res['engine']].stats['score_count'] += score
139 duplicated = False
140 duplicated = False
140 for new_res in results:
141 for new_res in results:
141 if res['parsed_url'].netloc == new_res['parsed_url'].netloc and\
142 if res['parsed_url'].netloc == new_res['parsed_url'].netloc and\
@@ -163,17 +164,24 @@ def search(query, request, selected_categories):
163def get_engines_stats():
164def get_engines_stats():
164 pageloads = []
165 pageloads = []
165 results = []
166 results = []
167+ scores = []
166
168
167− max_pageload = max_results = 0
169+ max_pageload = max_results = max_score = 0
168 for engine in engines.values():
170 for engine in engines.values():
169 if engine.stats['search_count'] == 0:
171 if engine.stats['search_count'] == 0:
170 continue
172 continue
171 results_num = engine.stats['result_count']/float(engine.stats['search_count'])
173 results_num = engine.stats['result_count']/float(engine.stats['search_count'])
172 load_times = engine.stats['page_load_time']/float(engine.stats['search_count'])
174 load_times = engine.stats['page_load_time']/float(engine.stats['search_count'])
175+ if results_num:
176+ score = engine.stats['score_count'] / float(engine.stats['search_count']) / results_num
177+ else:
178+ score = 0
173 max_results = max(results_num, max_results)
179 max_results = max(results_num, max_results)
174 max_pageload = max(load_times, max_pageload)
180 max_pageload = max(load_times, max_pageload)
181+ max_score = max(score, max_score)
175 pageloads.append({'avg': load_times, 'name': engine.name})
182 pageloads.append({'avg': load_times, 'name': engine.name})
176 results.append({'avg': results_num, 'name': engine.name})
183 results.append({'avg': results_num, 'name': engine.name})
184+ scores.append({'avg': score, 'name': engine.name})
177
185
178 for engine in pageloads:
186 for engine in pageloads:
179 engine['percentage'] = int(engine['avg']/max_pageload*100)
187 engine['percentage'] = int(engine['avg']/max_pageload*100)
@@ -181,7 +189,11 @@ def get_engines_stats():
181 for engine in results:
189 for engine in results:
182 engine['percentage'] = int(engine['avg']/max_results*100)
190 engine['percentage'] = int(engine['avg']/max_results*100)
183
191
192+ for engine in scores:
193+ engine['percentage'] = int(engine['avg']/max_score*100)
194+
184
195
185 return [('Page loads (sec)', sorted(pageloads, key=itemgetter('avg'), reverse=True))
196 return [('Page loads (sec)', sorted(pageloads, key=itemgetter('avg'), reverse=True))
186 ,('Number of results', sorted(results, key=itemgetter('avg'), reverse=True))
197 ,('Number of results', sorted(results, key=itemgetter('avg'), reverse=True))
198+ ,('Scores', sorted(scores, key=itemgetter('avg'), reverse=True))
187 ]
199 ]