身安不如心安,屋宽不如心宽 。

求帮助将dsl翻译为java的API

Elasticsearch | 作者 lc1993929 | 发布于2018年03月01日 | 阅读数:3402

前面的query都会写java的api,但是后面的aggs的嵌套就不知道怎么写了。es版本为5.3.3
 GET /realty_assistant/phoneinoutcallrecord/_search
{
  "query": {
    "bool": {
     "must": [
        {
          "range": {
            "dt": {
              "gte": 20170401,
              "lte": 20170631
            }
          }
        },
        {
          "term": {
            "account.keyword": {
              "value": "LNC"
            }
          }
        },
        {
          "match": {
            "callstatus": 0
          }
        },
        {
          "match": {
            "isphoneno": 1
          }
        },
        {
          "match": {
            "origin": "phone_in"
          }
        }
      ]
    }
  },
  "aggs": {
    "accountGroup": {
      "terms": {
        "field": "account.keyword",
        "size": 100000
      },
      "aggs": {
        "distinct": {
          "cardinality": {
            "field": "phone.keyword"
          }
        }
      }
    },
    "the_sum": {
      "sum_bucket": {
        "buckets_path": "accountGroup>distinct.value"
      }
    }
  }
}
已邀请:

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

您好,你这里不复杂。
1) "callstatus": 0    "isphoneno": 1    "origin": "phone_in" 改成term精确匹配;
2)最笨的方法,直接拼接dsl,用Java 检索API对接;
3)稍微复杂的方法,集合termQuery、boolQuery等对接JavaAPI就可以了。

lc1993929

赞同来自:

感谢楼上的回复。昨晚上解决了这个问题了,es5的java api的pipelineAggregation是单独放在一个接口下的,不是放在pipelineAggregationBuilders里面的,所以昨天一直没找到。现在找到了。把部分代码贴出来
SearchResponse searchResponse = client.prepareSearch(index).setTypes(phoneInOutCallRecordType).setQuery(
QueryBuilders.boolQuery()
.must(QueryBuilders.rangeQuery("dt").from(params.get("startTime")).to(params.get("endTime")))
.must(QueryBuilders.termsQuery("account.keyword", (List<String>) params.get("accounts")))
.must(QueryBuilders.matchQuery("callstatus", 0))
.must(QueryBuilders.matchQuery("origin", "phone_in"))
.must(QueryBuilders.matchQuery("isphoneno", 1))
).addAggregation(
AggregationBuilders.terms("accountGroup").field("account.keyword").size(Integer.MAX_VALUE)
.subAggregation(AggregationBuilders.cardinality("distinctPhone").field("phone.keyword"))
).addAggregation(
new SumBucketPipelineAggregationBuilder("phoneCount", "accountGroup>distinctPhone.value")
).get();

要回复问题请先登录注册