在Clojure中搜索记录的最简单方法

时间:2011-04-11 14:54:07

标签: clojure

我在Clojure中有一张这样的地图:

(def stuff #{

        {:a "help" :b "goodbye"}
        {:c "help2" :b "goodbye"}
        {:a "steve" :b "goodbye"}
        {:c "hello2" :b "sue"}
    })

:我想提供搜索,以便:

(search stuff "help")

:会回来:

 #{
    {:a "help" :b "goodbye"}
    {:c "help2" :b "goodbye"}
}

:最简单的方法是什么?

3 个答案:

答案 0 :(得分:7)

user=> (defn search [s q] (select #(some (partial re-find (re-pattern q)) (vals %)) s))
#'user/search
user=> (search stuff "help")
#{{:a "help", :b "goodbye"} {:c "help2", :b "goodbye"}}

这就是诀窍。

答案 1 :(得分:2)

全文搜索是一个不同的主题,但如果你可以使用正则表达式,我会使用类似的东西:

(defn match [re e]
    (re-find re (:a e))

(defn search [re m]
    (into #{} (filter (partial match re) m)))

答案 2 :(得分:1)

(filter (comp #{"help"} :a) stuff):新组合的函数首先在目标上调用:a,然后在结果上调用#{"help"}:如果:a属性为"help",则返回真值完全{{1}}。

将其转换为集合,并将其封装在具有您想要调整的参数的函数中,留给读者练习。但坦率地说,代码非常简单,每次想要进行“搜索”时,重写代码的速度可能会更短,更具可读性。