Scoring of search results
authorCharles Connell <charles@connells.org>
Fri, 3 Jan 2014 21:10:02 +0000 (16:10 -0500)
committerCharles Connell <charles@connells.org>
Fri, 3 Jan 2014 21:14:00 +0000 (16:14 -0500)
karmaworld/apps/notes/search.py

index 856a84a7bda9c72bfc432481b83c15f2d4c7317e..39081807d805106a5baf3bebe3dadc663c746466 100644 (file)
@@ -1,6 +1,7 @@
 #!/usr/bin/env python
 # -*- coding:utf8 -*-
 # Copyright (C) 2013  FinalsClub Foundation
+import calendar
 import time
 
 import indextank.client as itc
@@ -20,6 +21,12 @@ index = api_client.get_index(secret.INDEX)
 while not index.has_started():
     time.sleep(0.5)
 
+# Default scoring function
+# Results are sorted by combination of "relevance"
+# and number of thanks they have received.
+# "Relevance" is a black box provided by IndexDen.
+index.add_function(0, 'relevance * log(doc.var[0])')
+
 def note_to_dict(note):
     d = {
         'name': note.name,
@@ -32,13 +39,16 @@ def note_to_dict(note):
     if note.course:
         d['course_id'] = note.course.id
 
+    if note.uploaded_at:
+        d['timestamp'] = calendar.timegm(note.uploaded_at.timetuple())
+
     return d
 
 def add_document(note):
     if note.text:
-        index.add_document(note.id, note_to_dict(note))
+        index.add_document(note.id, note_to_dict(note), variables={0: note.thanks})
     else:
-        logger.warn("Note {n} has no text, will not add to IndexDen".format(n=note))
+        logger.warn("Note {n} has no text or thanks value, will not add to IndexDen".format(n=note))
 
 def remove_document(note):
     index.delete_document(note.id)
@@ -51,7 +61,7 @@ def search(query, course_id=None):
     else:
         real_query = '"%s" OR name:"%s"' % (query, query)
 
-    raw_results = index.search(real_query, snippet_fields=['text'])
+    raw_results = index.search(real_query, scoring_function=0, snippet_fields=['text'])
 
     results = {r['docid']: r['snippet_text'] for r in raw_results['results']}