elasticsearch QueryBuilder在术语查询中具有动态列表值

bag*_*gui 7 java elasticsearch

我有一个像下面的代码,我在bool查询中必须做多个.在这里,我在字段"地址"中传递必须的术语查询.现在ip地址将作为来自其他api的列表来找我,我必须传递列表中的所有ip作为必须条款查询.在这里,我没有办法在创建QueryBuilder时动态传递地址值.

请建议如何做到这一点.

public static SearchResponse searchResultWithAggregation(String es_index,
        String es_type, List<String> ipList, String queryRangeTime) {
        Client client = ESClientFactory.getInstance();

    QueryBuilder qb = QueryBuilders.boolQuery()
            .must(QueryBuilders.termQuery("address", "10.203.238.138"))
            .must(QueryBuilders.termQuery("address", "10.203.238.137"))
            .must(QueryBuilders.termQuery("address", "10.203.238.136"))
            .mustNot(QueryBuilders.termQuery("address", "10.203.238.140"))
            .should(QueryBuilders.termQuery("client", ""));

    queryRangeTime = "now-" + queryRangeTime + "m";
    FilterBuilder fb = FilterBuilders.rangeFilter("@timestamp")
            .from(queryRangeTime).to("now");

    SearchResponse response = client
            .prepareSearch(es_index)
            .setTypes(es_type)
            .setQuery(qb)
            .setPostFilter(fb)
            .addAggregation(
                    AggregationBuilders.avg("cpu_average").field("value"))
            .setSize(10).execute().actionGet();

    System.out.println(response.toString());
    return response;
}
Run Code Online (Sandbox Code Playgroud)

Bla*_*POP 10

您可以使用术语查询为单个字段传递多个值.创建一个字符串数组或集.并将其传递给术语查询.

  Set<String> address = new HashSet<String>();
  address.add("10.203.238.138");
  address.add("10.203.238.137");
  address.add("10.203.238.136");
  if(address!=null)
     QueryBuilder qb = QueryBuilders.boolQuery()
                .must(QueryBuilders.termsQuery("address",address))
                .mustNot(QueryBuilders.termQuery("address", "10.203.238.140"))
                .should(QueryBuilders.termQuery("client", ""));
  else
     QueryBuilder qb = QueryBuilders.boolQuery()
                .mustNot(QueryBuilders.termQuery("address", "10.203.238.140"))
                .should(QueryBuilders.termQuery("client", ""));
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你..!