首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在elasticsearch中通过Clojure和弹性进行嵌套聚合

在elasticsearch中通过Clojure和弹性进行嵌套聚合
EN

Stack Overflow用户
提问于 2016-02-04 05:43:26
回答 1查看 206关注 0票数 2

我很难找到使用嵌套弹性搜索聚合执行弹性h 2.2.1的例子。我查阅了源测试中的例子,但只找到了非嵌套聚合。

我的文档是tweet,每个文档都包含一个时间戳和一个情感评分。下面是我的名称空间的外观:

代码语言:javascript
复制
(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:

代码语言:javascript
复制
(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")))]

我可以用直方图来获取这样的每周推特数:

代码语言:javascript
复制
(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]))))

下面是不起作用的嵌套聚合。我试着每周收集一次推文,然后在每周的桶中获取情绪数据:

代码语言:javascript
复制
(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键,我已经确认该键的值是总体平均情绪。

这种嵌套方法会导致错误:

代码语言:javascript
复制
(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客户端与本地客户端可能存在问题。当然,我在本机客户端的测试回购中找到一个示例。如果我成功的话,我会修改我的代码,发布结果,并关闭这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-09 05:52:01

解决方案是切换到使用本机客户端,然后我遵循弹性测试回购中的示例,链接到问题的更新中。下面是代码现在的样子..。

代码语言:javascript
复制
(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"

切换到本地客户端后,平均每周的情绪查询如下:

代码语言:javascript
复制
(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]))))

这产生的结果如下:

代码语言:javascript
复制
{: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}}
   {...
    }]}}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35193357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档