Оператор SQL LIKE в 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)))

person Stepan Parunashvili    schedule 14.07.2014    source источник


Ответы (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, как я ищу иголку в двух стогах сена в приведенном выше примере.

person adamneilson    schedule 15.07.2014

Используйте функцию полный текст. Следующий пример из документации 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

person G__    schedule 10.12.2015