从Clojure Elasticsearch聚合查询中,我有一个映射的桶向量,如下所示,其中键是一个数字标识符,doc_count是出现的次数。
:buckets [{:key 14768496, :doc_count 464} {:key 14761312, :doc_count 440} {:key 14764921, :doc_count 412}]
给定一个类似于14768496的值,我希望能够检索doc_count,这里是464。
发布于 2022-03-01 00:29:15
我对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的换能器生成性作为into的"xform“参数,因此它避免了创建任何中间延迟序列。
您还可以执行(into {} (map (juxt :key :doc_count) buckets)),这将生成(键和文档计数)的向量对序列,然后将其“倒入”到一个空的散列映射中。
juxt返回一个参数的函数,该函数从每个参数的应用程序(传递给juxt的函数)生成向量到该参数:
user=> ((juxt inc dec) 42)
[43 41]发布于 2022-02-28 22:36:38
在构思这个问题时,我遇到了下面的解决方案,我现在想和大家分享一下,因为我花了一段时间才找到正确的方法。
(def accounts (apply hash-map
(mapcat
#(vector (% :key) (% :doc_count))
buckets)))这将产生以下地图:
{14768496 464, 14761312 440, 14764921 412}现在,检索工作非常简单:
(println (accounts 14768496))发布于 2022-03-01 00:02:05
创建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)
464https://stackoverflow.com/questions/71301794
复制相似问题