Browse Source

feat: search result mixer

Junyi Du 2 năm trước cách đây
mục cha
commit
1a07b72cec

+ 38 - 29
src/main/frontend/ai/search_mixer.cljs

@@ -4,9 +4,9 @@
 
 (defn assoc-default-fuse-score
   "If a search result doesn't contain :fuse-score, then add it with worst score"
-  [search-results]
-  (map (fn [result]
-         (if (contains? result :fuse-score)
+  [search-results] 
+  (map (fn [result] 
+         (if (get result :fuse-score)
            result
            (assoc result :fuse-score 1)))
        search-results))
@@ -15,7 +15,7 @@
   "If a search result doesn't contain :semantic-score, then add it with worst score"
   [search-results worst-score]
   (map (fn [result]
-         (if (contains? result :semantic-score)
+         (if (get result :semantic-score)
            result
            (assoc result :semantic-score worst-score)))
        search-results))
@@ -49,7 +49,6 @@
   ({
       :key <key to return>
       :content <string>
-      <other records>
   })
   return:
   ({
@@ -75,24 +74,33 @@
                   :fuse-score (or (score-map (get item :key)) 1.0)))
          search-results)))
 
-(defn transform-trad-results
-  "trad-results:
-     ({:block/uuid <uuid>
-         :block/content <content>})
-        return:
-        ({
-            :key <key to return>
-            :content <content>
-        })
-   "
-  [trad-results query]
-    (assoc-fuse-score (map (fn [result]
-                             {:key (:block/uuid result)})
-                           trad-results) query))
+(defn transform-search-results [results]
+  (let [blocks       (map (fn [block]
+                            {:key (:block/uuid block)
+                             :content (:block/content block)})
+                          (:blocks results))
+
+        pages-content (map (fn [page-content]
+                             {:key (:block/uuid page-content)
+                              :content (:block/snippet page-content)})
+                           (:pages-content results))
+
+        pages        (map (fn [page]
+                            {:key (str "page:" page)
+                             :content page})
+                          (:pages results))
+
+        files        (map (fn [file]
+                            {:key (str "file:" file)
+                             :content file})
+                          (:files results))]
+
+    (concat blocks pages-content pages files)))
 
 (defn get-worst-semantic-score
   [semantic-results]
-  (let [scores (map :semantic-score semantic-results)]
+  (let [scores (map :semantic-score semantic-results)
+        scores (conj scores 0)]
     (apply max scores)))
 
 (defn sort-scores-search-results
@@ -132,16 +140,17 @@
 
 (defn- merge-search-results'
   "Merge fuse.js search results with semantic search results and remove duplicates"
-  [trad-results semantic-results]
-  (-> trad-results
-      (concat semantic-results)
-      (merge-duplicated-search-results)
-      (assoc-default-fuse-score)
-      (assoc-default-semantic-score (get-worst-semantic-score semantic-results))
-      (sort-scores-search-results)))
+  [trad-results semantic-results] 
+ (-> trad-results
+     (concat semantic-results)
+     (merge-duplicated-search-results)
+     (assoc-default-fuse-score)
+     (assoc-default-semantic-score (get-worst-semantic-score semantic-results))
+     (sort-scores-search-results)))
   
 (defn merge-search-results
   [trad-results semantic-results query]
-  (let [trad-results (transform-trad-results trad-results query)
+  (let [trad-results (transform-search-results trad-results)
+        fuse-score-results (assoc-fuse-score trad-results query)
         semantic-results (transform-semantic-results semantic-results)]
-    (merge-search-results' trad-results semantic-results)))
+    (merge-search-results' fuse-score-results semantic-results)))

+ 3 - 2
src/main/frontend/search/semantic.cljs

@@ -7,6 +7,7 @@
             [frontend.search.db :as search-db]
             [frontend.ai.vector-store :as vector-store]
             [frontend.ai.text-encoder :as text-encoder]
+            [frontend.ai.search-mixer :as mixer]
             [frontend.state :as state]
             [logseq.graph-parser.util :as gp-util]
             [clojure.pprint :as pprint]))
@@ -19,8 +20,8 @@
 ;; TODO: Link to cmd+k panel
 (defn update-block-search-result
   [rets]
-  (prn "semantic search result:")
-  (pprint/pprint (map #(dissoc % :embed) rets)))
+  (prn "semantic search result:") 
+  (pprint/pprint (mixer/merge-search-results (:search/result @state/state) rets (:search/q @state/state))))
 
 ;; See protocol for full documentation
 (defrecord ^:large-vars/data-var Semantic [repo]

+ 3 - 4
src/test/frontend/searchmixer_test.cljs

@@ -145,9 +145,9 @@
       (is (= (set expected-results) (set merged-results))))))
 
 (deftest ^:focus test-merge-search-results
-  (let [trad-results [{:block/uuid "uuid1" :block/content "Hello world"}
-                      {:block/uuid "uuid2" :block/content "Goodbye world"}
-                      {:block/uuid "uuid3" :block/content "Hello universe"}]
+  (let [trad-results {:blocks '({:block/uuid "uuid1" :block/content "Hello world"}
+                                {:block/uuid "uuid2" :block/content "Goodbye world"}
+                                {:block/uuid "uuid3" :block/content "Hello universe"})}
         semantic-results [{:key "uuid4"
                            :id 18
                            :data {:snippet "Greetings earthlings"
@@ -167,5 +167,4 @@
 
     (is (not (empty? merged-results)))
     (is (= 5 (count merged-results)))
-    (prn merged-results)
     ))