我很难找到使用嵌套弹性搜索聚合执行弹性h 2.2.1的例子。我查阅了源测试中的例子,但只找到了非嵌套聚合。
我的文档是tweet,每个文档都包含一个时间戳和一个情感评分。下面是我的名称空间的外观:
(ns tweets.core
(:require [clojurewerkz.elastisch.rest :as es-rest]
[clojurewerkz.elastisch.rest.document :as es-doc]
[clojurewerkz.elastisch.query :as es-q]
[clojurewerkz.elastisch.rest.response :as es-rsp]
[clojurewerkz.elastisch.aggregation :as es-agg]
[clojure.pprint :as pp]))
(clojure.core/refer 'clojure.core)此代码按预期工作,在给定的一周内检索一些具有给定关键字的tweet:
(defn get-some-tweets
[kwd]
(let [conn (es-rest/connect local-es-host)
res (es-doc/search conn indices mapping
:query (es-q/filtered :query (es-q/query-string :query kwd)
:filter (es-q/range :timestamp :from "2015-11-19"
:to "2015-11-24")))]我可以用直方图来获取这样的每周推特数:
(defn counts-by-week
[kwd]
(let [conn (es-rest/connect local-es-host)
res (es-doc/search conn indices mapping
:query (es-q/query-string :query kwd)
:aggregations {:weekly-data (es-agg/date-histogram :timestamp "week")})]
(pp/pprint (get-in res [:aggregations]))))下面是不起作用的嵌套聚合。我试着每周收集一次推文,然后在每周的桶中获取情绪数据:
(defn avg-weekly-sentiment
[kwd]
(let [conn (es-rest/connect found-es-host {:basic-auth found-auth})
res (es-doc/search conn indices mapping
:query (es-q/query-string :query kwd)
:aggregations {:weekly-data (es-agg/date-histogram :timestamp "week")
:weekly-avg (es-agg/avg "sentiment")})]
(pp/pprint (get-in res [:aggregations]))))这将返回一个包含每周文档计数的映射,以及一个weekly-avg键,我已经确认该键的值是总体平均情绪。
这种嵌套方法会导致错误:
(defn avg-weekly-sentiment2
[kwd]
(let [conn (es-rest/connect found-es-host {:basic-auth found-auth})
res (es-doc/search conn indices mapping
:query (es-q/query-string :query kwd)
:aggregations {:weekly-data (es-agg/date-histogram :timestamp "week")
:aggregations {:weekly-avg (es-agg/avg "sentiment")}})]
(pp/pprint (get-in res [:aggregations]))))错误是
“无法在聚合中找到每周一次的聚合器类型\”
所以..。我对于使用elasticsearch的DSL相对来说还是比较新的,甚至对Clojure来说也是较新的。我还没有发现使用Clojure包装器进行嵌套聚合的任何示例,但它看起来像从2.2.0开始就支持这一点。。我确信我错过了一些简单的东西,但对于我的生活,我无法弄清楚(我没有展示其他几次尝试)。
更新:弹性谷歌集团指出,使用HTTP客户端与本地客户端可能存在问题。当然,我在本机客户端的测试回购中找到一个示例。如果我成功的话,我会修改我的代码,发布结果,并关闭这个问题。
发布于 2016-02-09 05:52:01
解决方案是切换到使用本机客户端,然后我遵循弹性测试回购中的示例,链接到问题的更新中。下面是代码现在的样子..。
(ns tweets.core
(:require [clojurewerkz.elastisch.native :as es-native]
[clojurewerkz.elastisch.native.document :as es-doc]
[clojurewerkz.elastisch.native.response :as es-rsp
[clojurewerkz.elastisch.query :as es-q]
[clojurewerkz.elastisch.aggregation :as es-agg]
[clojure.pprint :as pp]))
(clojure.core/refer 'clojure.core)
(def ^:private local-es-nhost [["<the-IP-of-the-ES-server>" 9300]])
;; Note the use of port 9300 instead of 9200 used with the HTTP client
(def ^:private local-cluster {"cluster.name" "elasticsearch"})
;; You can get the cluster name from curl <es-server>:9200/_nodes/cluster
;; The default name is "elasticsearch"切换到本地客户端后,平均每周的情绪查询如下:
(defn avg-weekly-sentiment
"I would have never guessed to use (merge ...) were it not for the elastich test code"
[kwd]
(let [conn (es-native/connect local-es-nhost local-cluster)
res (es-ndoc/search conn indices mapping
:query (es-q/query-string :query kwd)
:aggregations {:weekly (merge {:aggs {:avg_sentiment (es-agg/avg "sentiment")}}
(es-agg/date-histogram "timestamp" "week"))})]
(pp/pprint (get-in res [:aggregations]))))这产生的结果如下:
{:weekly
{:buckets
[{:doc_count 3572,
:key
#object[org.elasticsearch.common.joda.time.DateTime 0x6eaa586c "2015-10-12T00:00:00.000Z"],
:avg_sentiment {:value 0.39169344904815234}}
{:doc_count 4934,
:key
#object[org.elasticsearch.common.joda.time.DateTime 0x3fed225f "2015-10-19T00:00:00.000Z"],
:avg_sentiment {:value 0.7119037292257783}}
{...
}]}}https://stackoverflow.com/questions/35193357
复制相似问题