elasticsearch QueryBuilder with dynamic list value in term query
elasticsearch, java
Solution
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..!
Problem
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; } ```