弹性搜索QueryBuilder与术语查询中具有动态列表值 [英] elasticsearch QueryBuilder with dynamic list value in term query

查看:1005
本文介绍了弹性搜索QueryBuilder与术语查询中具有动态列表值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个像下面的代码,我正在做多个必须在bool查询。在这里,我在字段地址中传递必需项查询。现在,ip地址将作为其他api的列表来到我,我必须将列表中的所有ip作为必选项查询传递。在这里,我没有得到如何在创建QueryBuilder时动态传递地址值的方法。



请建议如何执行此操作。

  public static SearchResponse searchResultWithAggregation(String es_index,
String es_type,List< String> ipList,String queryRangeTime){
客户端客户端= ESClientFactory。的getInstance();

QueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery(address,10.203.238.138))
.must(QueryBuilders.termQuery(地址,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());
返回响应;
}


解决方案

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

 设置< 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 客户,));

希望它有帮助..!


I have a code like below where I'm doing multiple must in bool query. Here I'm passing the must term queries in field "address". Now the ip address will come to me as a list from other api and I have to pass for all the ip's in the list as a must term query. Here I'm not getting a way how to pass the address values dynamically when creating the QueryBuilder.

Please suggest how to do this.

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;
}

解决方案

You can use the terms query to pass multiple values for single field. create a string array or set. and pass it to the terms query.

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

Hope it helps..!

这篇关于弹性搜索QueryBuilder与术语查询中具有动态列表值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆