我想运行一个sql查询,给定一个搜索关键字,将查找所有用户,其名称与该模式匹配。即在原始SQL中,如WHERE users.name LIKE "%foo%"
我是怎么做到的?
查询的当前结构 - >
(defn find-users [db, search]
(->> (d/q '[:find ?u :where
[?u :user/uuid ?id]
[?u :user/name ..]
db)
(map first)))
答案 0 :(得分:2)
这就是我使用的。也许你可以根据自己的需要调整它。
(defn find-items "Full text search titles and descriptions for [search-term]" [search-term]
(let [keyys [:item-id :title :description]
rules '[[(finditem ?item ?term) [(fulltext $ :item/title ?term) [[?item ?name]]]]
[(finditem ?item ?term) [(fulltext $ :item/description ?term) [[?item ?name]]]]]
items (d/q '[:find ?item ?title ?description
:in $ ?term %
:where
(finditem ?item ?term)
[?item :item/title ?title]
[?item :item/description ?description]]
(d/db db/CONN)
search-term rules)]
(map #(zipmap keyys %) items)))
这使用规则,您可以在此处阅读:http://docs.datomic.com/query.html。规则作为一个非常好的SQL OR
等效,这就是我在上面的例子中搜索两个草堆中的针。
答案 1 :(得分:2)
使用fulltext function。 Datomic文档中的以下示例很好地说明了这一点:
;; query
[:find ?entity ?name ?tx ?score
:in $ ?search
:where [(fulltext $ :artist/name ?search) [[?entity ?name ?tx ?score]]]]
;; inputs
db, "Jane"
;; result
#{[17592186047274 "Jane Birkin" 2839 0.625]
[17592186046687 "Jane" 2267 1.0]
[17592186047500 "Mary Jane Hooper" 3073 0.5]}
您还希望使用:db/fulltext true