从 Clojure Elasticsearch 聚合查询中,我有一个如下图的存储桶向量,其中键是数字标识符,而 doc_count 是出现次数。
:buckets [{:key 14768496, :doc_count 464} {:key 14761312, :doc_count 440} {:key 14764921, :doc_count 412}]
给定一个值,14768496
我希望能够在此处检索 doc_count 464
。
我对 OP 自己的答案提供了一些反馈,但认为它本身就值得作为答案提供:
user> (def buckets [{:key 14768496, :doc_count 464} {:key 14761312, :doc_count 440} {:key 14764921, :doc_count 412}])
#'user/buckets
user=> (def accounts (into {} (map (juxt :key :doc_count)) buckets))
#'user/accounts
这使用产生转换器的数量map
作为“xform”参数,into
因此它避免创建任何中间惰性序列。
您也可以这样做(into {} (map (juxt :key :doc_count) buckets))
,这将产生一个惰性向量对序列(键和文档计数),然后将其“倒入”一个空的哈希映射中。
juxt
返回一个参数的函数,该函数从每个参数(传递给的函数juxt
)到该参数的应用中生成一个向量:
user=> ((juxt inc dec) 42)
[43 41]
在提出问题时,我遇到了以下解决方案,我现在想分享一下,因为我花了一段时间才找到正确的方法。
(def accounts (apply hash-map
(mapcat
#(vector (% :key) (% :doc_count))
buckets)))
这会产生以下地图:
{14768496 464, 14761312 440, 14764921 412}
现在检索很简单:
(println (accounts 14768496))
accounts
创建地图的另一种方式:
user> (def buckets [{:key 14768496, :doc_count 464} {:key 14761312, :doc_count 440} {:key 14764921, :doc_count 412}])
#'user/buckets
user> (def accounts (zipmap (map :key buckets) (map :doc_count buckets)))
#'user/accounts
或者 ...
user> (defn find-doc-count [k buckets] (some #(when (= (:key %) k) (:doc_count %)) buckets))
#'user/find-doc-count
user> (find-doc-count 14768496 buckets)
464