弹性搜索QueryBuilder与术语查询中具有动态列表值 [英] elasticsearch QueryBuilder with dynamic list value in term query
本文介绍了弹性搜索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屋!
查看全文