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

 热情连心锁426 发布于 2023-01-11 17:00

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

请建议如何做到这一点.

public static SearchResponse searchResultWithAggregation(String es_index,
        String es_type, List 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;
}

BlackPOP.. 10

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

  Set address = new HashSet();
  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", ""));

希望能帮助到你..!

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

      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", ""));
    

    希望能帮助到你..!

    2023-01-11 17:05 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有