0

从 Clojure Elasticsearch 聚合查询中,我有一个如下图的存储桶向量,其中键是数字标识符,而 doc_count 是出现次数。

:buckets [{:key 14768496, :doc_count 464} {:key 14761312, :doc_count 440} {:key 14764921, :doc_count 412}]

给定一个值,14768496我希望能够在此处检索 doc_count 464

4

3 回答 3

2

我对 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]
于 2022-03-01T00:29:15.213 回答
0

在提出问题时,我遇到了以下解决方案,我现在想分享一下,因为我花了一段时间才找到正确的方法。

(def accounts (apply hash-map
                      (mapcat
                        #(vector (% :key) (% :doc_count))
                        buckets)))

这会产生以下地图:

{14768496 464, 14761312 440, 14764921 412}

现在检索很简单:

(println (accounts 14768496))
于 2022-02-28T22:36:38.003 回答
0

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
于 2022-03-01T00:02:05.663 回答