【问题标题】:Why the fulltext search failed on Datomic?为什么在 Datomic 上全文搜索失败?
【发布时间】:2022-01-08 16:45:26
【问题描述】:

datomic-free 0.9.5697、clojure 1.10.3 和 openjdk 17.01 上测试。

(require '[datomic.api :as d])

(def uri "datomic:mem://test")
(d/create-database uri)
(def conn (d/connect uri))
(def db (-> conn d/db delay))

(def schema [{:db/ident :person/name
              :db/valueType :db.type/string
              :db/cardinality :db.cardinality/one}])
(d/transact conn schema)

(def datoms [{:person/name "Oliver Smith"}])
(d/transact conn datoms)

(def query '[:find ?name
             :where
             [_ :person/name ?name]])
(-> (d/q query @db) println) ; ok => #{[Oliver Smith]}

(def query '[:find ?name
             :where
             [(fulltext $ :person/name "Smith") [[_ ?name]]]])

(-> (d/q query @db) println) ; nok => expected: #{[Oliver Smith]}, actual: #{}

为什么上面的fulltext搜索返回空?

【问题讨论】:

  • 我认为架构定义缺少 :db/fulltext true 以在属性上启用 fulltext indexing

标签: clojure datomic


【解决方案1】:

正如@Steffan Westcott 所指出的,我们需要将:db/fulltext true 添加到架构中所需的属性中,从而启用对其进行全文搜索的功能。现在它在浪费了几个小时来找出自己之后起作用了。非常感谢,Steffan。

根据doc

:db/fulltext 指定一个布尔值,表示最终 应生成一致的全文搜索索引 属性。默认为 false。

所以上述架构在下面得到更正,

(def schema [{:db/ident :person/name
              :db/valueType :db.type/string
              :db/cardinality :db.cardinality/one
              :db/fulltext true}
            ])

我们可以通过下面的另一个示例来证明对 Datomic 作品的全文搜索 - 查找谁是“史密斯”,“音乐”是他们的爱好之一。

test.clj

(require '[datomic.api :as d])

(def uri "datomic:mem://test")
(d/create-database uri)
(def conn (d/connect uri))
(def db (-> conn d/db delay))

(def schema [{:db/ident :person/name
              :db/valueType :db.type/string
              :db/cardinality :db.cardinality/one
              :db/fulltext true}
             {:db/ident :person/hobby
              :db/valueType :db.type/string
              :db/cardinality :db.cardinality/one
              :db/fulltext true}
             ])
(d/transact conn schema)

(def datoms [{:person/name "Oliver Smith" :person/hobby "reading, sports and music"}
             {:person/name "Amelia Smith" :person/hobby "reading, music and dance"}
             {:person/name "George Smith" :person/hobby "reading and sports"}
             {:person/name "Amelia Jones" :person/hobby "reading, music and dance"}
             ])
(d/transact conn datoms)

(def query '[:find ?name ?hobby
             :where
             [(fulltext $ :person/name "Smith") [[?p ?name]]]
             [(fulltext $ :person/hobby "music") [[?p ?hobby]]]
             ])
(-> (d/q query @db) println) ; ok

运行它以获得下面的预期结果,

$ clj -Sdeps '{:deps {com.datomic/datomic-free {:mvn/version "0.9.5697"}}}' -M test.clj

stdout: #{[Oliver Smith reading, sports and music]
          [Amelia Smith reading, music and dance]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 2013-05-29
    • 1970-01-01
    相关资源
    最近更新 更多