search demo
[wolnelektury.git] / apps / search / views.py
index fc14b06..d9b2f26 100644 (file)
@@ -1,5 +1,4 @@
 
 
-
 from django.shortcuts import render_to_response, get_object_or_404
 from django.template import RequestContext
 from django.contrib.auth.decorators import login_required
 from django.shortcuts import render_to_response, get_object_or_404
 from django.template import RequestContext
 from django.contrib.auth.decorators import login_required
@@ -9,6 +8,31 @@ from catalogue.utils import get_random_hash
 from catalogue.models import Book, Tag
 from catalogue import forms
 from search import MultiSearch, JVM, SearchResult
 from catalogue.models import Book, Tag
 from catalogue import forms
 from search import MultiSearch, JVM, SearchResult
+from lucene import StringReader
+
+import enchant
+
+dictionary = enchant.Dict('pl_PL')
+
+
+def did_you_mean(query, tokens):
+    change = {}
+    
+    for t in tokens:
+        print("%s ok? %s, sug: %s" %(t, dictionary.check(t), dictionary.suggest(t)))
+        if not dictionary.check(t):
+            try:
+                change[t] = dictionary.suggest(t)[0]
+            except IndexError:
+                pass
+
+    if change == {}:
+        return None
+
+    for frm, to in change.items():
+        query = query.replace(frm, to)
+        
+    return query
 
 
 def main(request):
 
 
 def main(request):
@@ -17,15 +41,26 @@ def main(request):
     srch = MultiSearch()
 
     results = None
     srch = MultiSearch()
 
     results = None
+    query = None
+    fuzzy = False
     if 'q' in request.GET:
     if 'q' in request.GET:
-        toks = srch.get_tokens(request.GET['q'])
-        results = SearchResult.aggregate(srch.search_perfect_book(toks),
-                                         srch.search_perfect_parts(toks),
-                                         srch.search_everywhere(toks))
+        query = request.GET['q']
+        toks = StringReader(query)
+        fuzzy = 'fuzzy' in request.GET
+        if fuzzy:
+            fuzzy = 0.7
+
+
+        results = SearchResult.aggregate(srch.search_perfect_book(toks, fuzzy=fuzzy),
+                                         srch.search_perfect_parts(toks, fuzzy=fuzzy),
+                                         srch.search_everywhere(toks, fuzzy=fuzzy))
         results.sort(reverse=True)
 
         for r in results:
             print r.parts
 
         results.sort(reverse=True)
 
         for r in results:
             print r.parts
 
-    return render_to_response('newsearch/search.html', {"results": results},
+    return render_to_response('newsearch/search.html', {'results': results,
+                                                        'did_you_mean': (query is not None) and 
+                                                        did_you_mean(query, srch.get_tokens(query, field='SIMPLE')),
+                                                        'fuzzy': fuzzy},
                               context_instance=RequestContext(request))
                               context_instance=RequestContext(request))