【问题标题】:How to generate below query using elasticsearch java api如何使用 elasticsearch java api 生成以下查询
【发布时间】:2015-11-17 04:30:12
【问题描述】:

我想使用 Elasticsearch JAVA API 生成类似的查询。我正在尝试在聚合级别应用过滤器。

{
    "query":{
        "filtered":{
            "filter":{ "terms":{ "family_name":"Brown" } } //filter_1
        }
    },
    "aggs":{
        "young_age":{
            "filter":{
                "terms" : {
                   "gender" : "male" //filter_2
                 } 
            },
            "aggs":{
                "age":{
                    "terms":{
                        "field":"age"
                    }
                }
            }
        }
    }
}

请找到我最喜欢的示例代码

TermFilterBuilder family_filter_1 = FilterBuilders.termFilter("family_name","Brown");

FilteredQueryBuilder qbuilder =QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),family_filter_1);


SearchRequestBuilder search  = client.prepareSearch("test_index")
.setTypes("test_type")
.setSearchType(SearchType.COUNT)
.setQuery(qbuilder);

search.addAggregation(terms("age").field("age") 
.size(0)// Size 0 returns all the "group by keys"
.order(Terms.Order.count(true))); // to sort the output 

System.out.println(""+search);

我得到了回应。请建议如何添加filter_2

{
  "query" : {
    "filtered" : {
      "query" : {
        "match_all" : { }
      },
      "filter" : {
        "term" : {
          "family_name" : "Brown"
        }
      }
    }
  },
  "aggregations" : {
    "age" : {
      "terms" : {
        "field" : "age",
        "size" : 0,
        "order" : {
          "_count" : "asc"
        }
      }
    }
  }
}

提前谢谢..

【问题讨论】:

  • 您缺少运行range 过滤聚合的字段的名称,即运行filter_2 的字段。
  • @val 这只是一个例子......修改了问题......谢谢

标签: java elasticsearch aggregate


【解决方案1】:

你可以这样做:

// same as your code
TermFilterBuilder family_filter_1 = ...;
FilteredQueryBuilder qbuilder = ...;
SearchRequestBuilder search = ...;

// build the range filter
RangeQuery ageRange = QueryBuilders.rangeQuery("age")
    .from(18).to(40).includeLower(false).includeUpper(false);

// build the terms sub-aggregation
TermsAggregation age = AggregationBuilders.terms("age")
    .field("age") 
    .size(0)
    .order(Terms.Order.count(true));

// build the filter top-aggregation
FilterAggregationBuilder youngAge = AggregationBuilders
    .filter("young_age")
    .filter(ageRange)
    .subAggregation(age);


search.addAggregation(youngAge);

【讨论】:

  • 感谢 AggregationBuilders 的逻辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多