IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> ElasticSearch7.10.2中多条件查询 -> 正文阅读

[大数据]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

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:16:50  更:2021-08-04 11:17:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:21:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码