]> git.0d.be Git - chloro.git/commitdiff
add api view for full text search
authorFrédéric Péters <fpeters@0d.be>
Thu, 21 Jul 2022 18:24:14 +0000 (20:24 +0200)
committerFrédéric Péters <fpeters@0d.be>
Thu, 21 Jul 2022 18:25:57 +0000 (20:25 +0200)
chloro/phyll/urls.py
chloro/phyll/views.py

index bc58fbd6420bab467fbe4bd91887785ac13382df..9c884829c1d4f94cc2cc77983e16c7ed85d04571 100644 (file)
@@ -40,6 +40,7 @@ urlpatterns = [
     url(r'^(?P<slug>[\w:-]+)/api-save/$', staff_member_required(views.NoteApiSaveView.as_view())),
     url(r'^ajax/upload/$', staff_member_required(views.ajax_upload)),
     url(r'^ajax/newpage/$', staff_member_required(views.ajax_new_page)),
+    url(r'^ajax/search/$', views.ajax_search, name='ajax-search'),
     url(r'^new-note/$', staff_member_required(views.NoteAddView.as_view(), login_url='login')),
     url(r'^feeds/(?P<sub>[\w:-]+)/atom$', views.AtomFeed()),
     url(r'^feed/atom$', views.AtomFeed()),
index 0de25372a9eda14d6f61c3faaa7998c571859779..829020cfc5d27b6a5313e00caa4554fadc2406a5 100644 (file)
@@ -18,6 +18,7 @@ import os
 import urllib.parse
 
 from django.conf import settings
+from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
 from django.contrib.syndication.views import Feed
 from django.core.exceptions import PermissionDenied
 from django.core.files.storage import default_storage
@@ -187,3 +188,14 @@ def ajax_new_page(request, *args, **kwargs):
             'request_id': request.POST['request_id'],
         }
     )
+
+
+def ajax_search(request, *args, **kwargs):
+    vector = SearchVector('title', weight='A') + SearchVector('text', weight='B')
+    query = SearchQuery(request.GET.get('q', ''), config='french')
+    results = (
+        Note.objects.annotate(rank=SearchRank(vector, query)).filter(rank__gte=0.3).order_by('-rank')[:10]
+    )
+    return JsonResponse(
+        {'data': [{'title': x.title, 'rank': x.rank, 'url': x.get_absolute_url()} for x in results]}
+    )