ElasticSearch 8以及ElasticSearch 7.17以上 推荐使用ElasticSearch Java API,ElasticSearch高级组合检索

前言

        最近在测试使用ElasticSearch 7.17遇到了一些使用问题弃用了High Level REST Client,原本使用RestHighLevelClient客户端发送请求,已经移除。现使用新客户端ElasticsearchClient,网上很多高级组合检索还是老版本的,查询比较费劲,现整理一份以便使用

        简单的索引、文档以及操作请参考如下:

elasticsearch整合java使用创建索引、指定索引映射、操作添加文档、删除文档、更新文档、批量操作_java调用es创建es索引-CSDN博客

elasticsearch复杂检索,match、matchAll、matchPhrase、term、多条件查询、multiMatch多字段查询、分页查询、排序、指定查询字段查询等-CSDN博客

在我们生产使用场景中,会传入多个查询检索条件,可能是一个或者多个,可以根据自己的传入条件进行判断空null进行相应的的逻辑处理。

高级组合检索

@Test
    public void seniorSearch() throws IOException {
        ElasticsearchClient elasticsearchClient = elasticSearchConfig.esRestClient();
        // 1动态构建出查询需要的DSL语句
        // 准备检索请求
        SearchRequest.Builder builder = buildSearchRequest();
        SearchResponse<Object> search = elasticsearchClient.search(builder.build(), Object.class);
        // 分析响应数据封装成需要的格式。
        // 打印简单结果
        search.hits().hits().forEach(s -> {
            System.out.printf("\n" + s.source().toString());
        });
    }

构建需要查询的DSL

private SearchRequest.Builder buildSearchRequest() {
        SearchRequest.Builder builder = new SearchRequest.Builder();
        // 设置查询索引
        builder.index("bank");
        BoolQuery.Builder boolBuilder = new BoolQuery.Builder();
        // must 模糊匹配Street
        boolBuilder.must(mu->mu.match(ma->ma.field("address").query("Street")));

        // 按照gender性别进行过滤
        boolBuilder.filter(f->f.term(t->t.field("gender.keyword").value("M")));

        // 按照年龄批量过滤
        List<FieldValue> fieldValues = new ArrayList<>();
        fieldValues.add(FieldValue.of(32));
        fieldValues.add(FieldValue.of(33));
        boolBuilder.filter(f->f.terms(t->t.field("age").terms(te->te.value(fieldValues))));
        // 按照编号进行区间筛选account_number
        boolBuilder.filter(f->f.range(r->r.field("account_number").gt(JsonData.of(1)).lt(JsonData.of(500))));
        builder.query(q->q.bool(boolBuilder.build()));
        /**
         * 排序
         */
        builder.sort(s->s.field(f->f.field("account_number").order(SortOrder.Asc)));

        /**
         * 分页
         */
        builder.from(0);
        builder.size(5);

        /**
         * 高亮
         */
        builder.highlight(h->h.preTags("<span>").postTags("<span>").fields("address",hf->hf));

        return builder;
    }

备注:使用的数据为官方提供的数据,如有需要:

elasticsearch提供的官方样本数据-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值