今天在做项目的时候需要做ES的多条件查询,相当于sql中的:
select * from table where A = 'valA' and (B = 'valB' or C = 'valC';)
一开始是这样写的:
BoolQueryBuilder builders= QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("IPv4_Src", typeSelection))
.must(QueryBuilders.boolQuery()
.should(QueryBuilders.termQuery("IPv4_Src", ipSelection))
.should(QueryBuilders.termQuery("IPv4_Dst", ipSelection)));
结果返回的数据是空,用RESTful去写一遍才发现term是不能生成的,把termQuery改成matchQuery即可得到。
另外因为多了一个参数进来,四个参数做多条件匹配,这是第一次做,在同事那问了一遍发现可以用NativeSearchQueryBuilder去做,于是就有下面的代码:
public List<Map<String, Object>> ESSearchBySe(String fileSelection, String typeSelection, String ipSelection, String portSelection) {
System.out.println("文件名为:"+fileSelection+"类型为:"+typeSelection+"ip为:"+ipSelection+"端口为:"+portSelection);
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
if(typeSelection != null && !"".equals(typeSelection)){
builder.withQuery(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("IPv4_Proto",typeSelection)));
}
if(ipSelection != null && !"".equals(ipSelection)){
builder.withQuery(QueryBuilders.boolQuery().must(QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("IPv4_Src",ipSelection)))
.should(QueryBuilders.matchQuery("IPv4_Dst",ipSelection)));
}
if (portSelection != null && !"".equals(portSelection)){
builder.withQuery(QueryBuilders.boolQuery().must(QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("TCP_Port_Src",portSelection)))
.should(QueryBuilders.matchQuery("TCP_Port_Dst",portSelection)));
}
SearchRequest searchRequest = new SearchRequest()
return null;
}
但是看了一下,为什么不能去构建索引的query呢,如果用SearchRequest去装索引的话发送的请求必须是searchSourceBuilder,不能用NativeSearchQueryBuilder,而在elasticsearch6.8中的NativeSearchQueryBuilder是有.indices的方法的,在7.10.2中这个方法不知道为什么莫名其妙的消失了,所以改用queryBuilder去构建:
public List<Map<String, Object>> ESSearchBySe(String fileSelection, String typeSelection, String ipSelection, String portSelection) throws IOException {
System.out.println("文件名为:"+fileSelection+"类型为:"+typeSelection+"ip为:"+ipSelection+"端口为:"+portSelection);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SearchRequest searchRequest = new SearchRequest(fileSelection);
searchSourceBuilder.size(10000);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
searchSourceBuilder.timeout(new TimeValue(60,TimeUnit.SECONDS));
if(typeSelection != null && !"".equals(typeSelection)){
System.out.println("1111111111");
queryBuilder.must(QueryBuilders.matchQuery("IPv4_Proto",typeSelection));
}
if(ipSelection != null && !"".equals(ipSelection)){
System.out.println("22222222222222");
queryBuilder.must(QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("IPv4_Src",ipSelection))
.should(QueryBuilders.matchQuery("IPv4_Dst",ipSelection)));
}
if (portSelection != null && !"".equals(portSelection)){
System.out.println("3333333333333333");
queryBuilder.must(QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("TCP_Port_Src",portSelection))
.should(QueryBuilders.matchQuery("TCP_Port_Dst",portSelection)));
}
searchSourceBuilder.query(queryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
List<Map<String,Object>> list = new ArrayList<>();
for (SearchHit documentsFields:searchResponse.getHits()) {
list.add(documentsFields.getSourceAsMap());
}
return list;
}
}
很坑啊官网也没有找到这个NativeSearchQueryBuilder