ElasticSearch7.10.2中多条件查询

今天在做项目的时候需要做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

上一篇:三.Jojgging慢跑


下一篇:Codeforces Round #680 (Div. 2)C. Division