数据组中的SQL LIKE运算符

时间:2014-07-14 20:28:23

标签: datomic

我想运行一个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)))

2 个答案:

答案 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

schema中搜索您正在搜索全文搜索的字段