【问题标题】:elasticsearch QueryBuilder with dynamic list value in term queryelasticsearch QueryBuilder在术语查询中具有动态列表值
【发布时间】:2018-03-26 21:58:01
【问题描述】:

我有一个类似下面的代码,我在布尔查询中执行多个必须。在这里,我在“地址”字段中传递了必须的术语查询。现在 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;
}

【问题讨论】:

    标签: java elasticsearch


    【解决方案1】:

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

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

    希望对您有所帮助..!

    【讨论】:

    • 感谢 BlackPOP,我尝试使用迭代器循环并继续在 QueryBuilder 中添加 .must() 来构建 boolQuery。我现在遇到的问题是,即使我发送一个空集,我也会得到聚合结果。而返回应该为空。你能帮忙吗
    • 只需在添加集合或条件之前进行空检查..!
    • 嗯,当我尝试为条款查询发送 hashset 时,我收到了 QueryParsingException[[term] query does not support array of values];。编辑:想通了。我使用的是 termQuery 而不是 termsQuery(最后忘记了“s”)。
    【解决方案2】:

    如果您将 TermsQuery 用于地址数组/集,它将返回与至少一个或多个提供的术语匹配的任何文档。

    List<String> address = new ArrayList<String>();
    address.add("10.203.238.138");
    address.add("10.203.238.137");
    address.add("10.203.238.136");
    
    BoolQueryBuilder qb = QueryBuilders.boolQuery();
    qb.mustNot(QueryBuilders.termQuery("address", "10.203.238.140"));
    qb.should(QueryBuilders.termQuery("client", ""));
    
    for(String add: Address){
        qb.must(QueryBuilders.termsQuery("address",add));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      相关资源
      最近更新 更多