Просмотр исходного кода

Speed up building search indice

Tienson Qin 3 лет назад
Родитель
Сommit
e7331f33b0

+ 1 - 2
src/main/frontend/components/editor.cljs

@@ -177,8 +177,7 @@
                              repo (state/sub :git/current-repo)
                              format (db/get-page-format page)
                              block (db-model/query-block-by-uuid uuid)
-                             content (search-db/block->content block)]
-
+                             content (:block/content block)]
                          [:.py-2 (search/block-search-result-item repo uuid format content q :block)]))
         :class       "black"}))))
 

+ 14 - 10
src/main/frontend/components/search.cljs

@@ -68,15 +68,19 @@
    content])
 
 (rum/defc block-search-result-item
-  [repo uuid _format content q search-mode]
-  [:div [(when (not= search-mode :page)
-           [:div {:class "mb-1" :key "parents"} (block/block-parents {:id "block-search-block-parent"
-                                                                      :block? true
-                                                                      :search? true}
-                                                                     repo
-                                                                     (clojure.core/uuid uuid)
-                                                                     {:indent? false})])
-         [:div {:class "font-medium" :key "content"} (highlight-exact-query content q)]]])
+  [repo uuid format content q search-mode]
+  (let [content (search-handler/sanity-search-content format content)]
+    [:div
+     (when (not= search-mode :page)
+       [:div {:class "mb-1" :key "parents"}
+        (block/block-parents {:id "block-search-block-parent"
+                              :block? true
+                              :search? true}
+                             repo
+                             (clojure.core/uuid uuid)
+                             {:indent? false})])
+     [:div {:class "font-medium" :key "content"}
+      (highlight-exact-query content q)]]))
 
 (defonce search-timeout (atom nil))
 
@@ -207,7 +211,7 @@
                                                         repo (state/sub :git/current-repo)
                                                         format (db/get-page-format page)
                                                         block (model/query-block-by-uuid uuid)
-                                                        content (search-db/block->content block)]
+                                                        content (:block/content block)]
                                                     [:span {:data-block-ref uuid}
                                                       (search-result-item "Block"
                                                         (block-search-result-item repo uuid format content search-q search-mode))])

+ 15 - 2
src/main/frontend/handler/search.cljs

@@ -5,7 +5,10 @@
             [frontend.search :as search]
             [frontend.state :as state]
             [frontend.util :as util]
-            [promesa.core :as p]))
+            [promesa.core :as p]
+            [frontend.text :as text]
+            [frontend.util.drawer :as drawer]
+            [frontend.util.property :as property]))
 
 (defn add-search-to-recent!
   [repo q]
@@ -15,6 +18,13 @@
           new-items (take 10 (distinct (cons q items)))]
       (db/set-key-value repo :recent/search new-items))))
 
+(defn sanity-search-content
+  "Convert a block to the display contents for searching"
+  [format content]
+  (->> (text/remove-level-spaces content format)
+       (drawer/remove-logbook)
+       (property/remove-built-in-properties format)))
+
 (defn search
   ([repo q]
    (search repo q {:limit 20}))
@@ -27,7 +37,10 @@
                         (:db/id (db/entity repo [:block/name (util/page-name-sanity-lc page-db-id)]))
                         page-db-id)
            opts (if page-db-id (assoc opts :page (str page-db-id)) opts)]
-       (p/let [blocks (search/block-search repo q opts)]
+       (p/let [blocks (search/block-search repo q opts)
+               blocks (map (fn [b]
+                             (let [format (:block/format (db/entity [:block/uuid (:block/uuid b)]))]
+                               (update b :block/content (partial sanity-search-content format)))) blocks)]
          (let [result (merge
                        {:blocks blocks
                         :has-more? (= limit (count blocks))}

+ 6 - 13
src/main/frontend/search/db.cljs

@@ -4,30 +4,23 @@
             [clojure.string :as string]
             [frontend.db :as db]
             [frontend.state :as state]
-            [frontend.text :as text]
             [frontend.util :as util]
-            [frontend.util.drawer :as drawer]
-            [frontend.util.property :as property]
             ["fuse.js" :as fuse]))
 
 (defonce indices (atom nil))
 
-(defn block->content
-  "Convert a block to the display contents for searching"
-  [{:block/keys [content format]}]
-  (->> (text/remove-level-spaces content format)
-       (drawer/remove-logbook)
-       (property/remove-built-in-properties format)))
+(defn empty?
+  [repo]
+  (nil? (get @indices repo)))
 
 (defn block->index
   "Convert a block to the index for searching"
-  [{:block/keys [uuid page] :as block}]
-  (when-let [result (->> (block->content block)
-                         (util/search-normalize))]
+  [{:block/keys [uuid page content] :as block}]
+  (when-let [content (util/search-normalize content)]
     {:id (:db/id block)
      :uuid (str uuid)
      :page page
-     :content result}))
+     :content content}))
 
 (defn build-blocks-indice
   ;; TODO: Remove repo effects fns further up the call stack. db fns need standardization on taking connection