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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值