]> git.ipfire.org Git - ipfire.org.git/blobdiff - src/backend/wiki.py
wiki: Implement search
[ipfire.org.git] / src / backend / wiki.py
index 651887a80b42f14ddb4985c74d64cf088621fb0a..50748e98b74b04c4d8dd8f362a9f4bee63fbac27 100644 (file)
@@ -5,6 +5,7 @@ import os.path
 import re
 
 from . import misc
+from . import util
 from .decorators import *
 
 class Wiki(misc.Object):
@@ -67,6 +68,23 @@ class Wiki(misc.Object):
 
                return ret
 
+       def search(self, query, limit=None):
+               query = util.parse_search_query(query)
+
+               res = self._get_pages("SELECT wiki.* FROM wiki_search_index search_index \
+                       LEFT JOIN wiki ON search_index.wiki_id = wiki.id \
+                       WHERE search_index.document @@ to_tsquery('english', %s) \
+                               ORDER BY ts_rank(search_index.document, to_tsquery('english', %s)) DESC \
+                       LIMIT %s", query, query, limit)
+
+               return list(res)
+
+       def refresh(self):
+               """
+                       Needs to be called after a page has been changed
+               """
+               self.db.execute("REFRESH MATERIALIZED VIEW wiki_search_index")
+
 
 class Page(misc.Object):
        def init(self, id, data=None):