SpringBoot 操作 ElasticSearch

本文只涉及一些基本操作!

引入依赖

<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.8.0</version>
</dependency>

<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.8.0</version>
</dependency>

创建客户端:

前提是先在本地运行好 es

public static void main(String[] args) throws Exception {

        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost",9201,"http"))
        );


        // 关闭 ES 客户端
        esClient.close();

    }

索引操作

新增索引

// 创建索引
        CreateIndexRequest request = new CreateIndexRequest("user");
        CreateIndexResponse response = esClient.indices().create(request, RequestOptions.DEFAULT);

        //查看响应状态
        boolean acknowledged = response.isAcknowledged();
        System.out.println("操作索引:"+acknowledged);

删除索引

// 删除索引
        DeleteIndexRequest request = new DeleteIndexRequest("user");
        AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);

        //查看响应状态
        boolean acknowledged = response.isAcknowledged();
        System.out.println("操作索引:"+acknowledged);

查询索引

// 查询索引
        GetIndexRequest request = new GetIndexRequest("user");
        GetIndexResponse response = esClient.indices().get(request, RequestOptions.DEFAULT);

        // 获取别名
        System.out.println(response.getAliases());

文档操作

基本操作

新增

注意:向 ES 中插入数据前要先把对象转为 JSON

//向哪个索引插入?主键ID是啥?
        request.index("user").id("1");

        User user=new User();
        user.setName("shone");
        user.setAge(20);
        user.setSex("男");

        //向 ES 插入数据必须转化为 JSON!
        ObjectMapper objectMapper = new ObjectMapper();
        String userJson = objectMapper.writeValueAsString(user);
        // 放入请求中
        request.source(userJson, XContentType.JSON);
        
        IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);

        // 查看是否插入成功
        System.out.println(response.getResult());
更新
        UpdateRequest request = new UpdateRequest();
        // 指定索引和 ID
        request.index("user").id("1");
        //修改文档
        request.doc(XContentType.JSON,"age","21");

        UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);
查询
        GetRequest request = new GetRequest();
        //指定索引和 ID
        request.index("user").id("1");

        GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
        // 获取文档内容(以字符串形式返回)
        System.out.println(response.getSourceAsString());
删除
        DeleteRequest request = new DeleteRequest();

        request.index("user").id("1");

        DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);

        System.out.println(response.toString());

批量操作

本质上是把多个请求进行打包处理

批量新增
        // 批量新增数据
        BulkRequest bulkRequest = new BulkRequest();

        IndexRequest request1 = new CreateIndexRequest().index("user").id("2").source(XContentType.JSON, "name", "shone2","age","18","sex","男");
        IndexRequest request2 = new IndexRequest().index("user").id("3").source(XContentType.JSON, "age", "22");
        IndexRequest request3 = new IndexRequest().index("user").id("4").source(XContentType.JSON, "sex", "女");
        bulkRequest.add(request1);
        bulkRequest.add(request2);
        bulkRequest.add(request3);
        //批量处理
        BulkResponse response = esClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        // 批量处理的花费时间
        System.out.println(response.getTook());
批量删除
        //批量删除
        BulkRequest bulkRequest = new BulkRequest();

        bulkRequest.add(new DeleteRequest().index("user").id("2"));
        bulkRequest.add(new DeleteRequest().index("user").id("3"));
        bulkRequest.add(new DeleteRequest().index("user").id("4"));

        esClient.bulk(bulkRequest, RequestOptions.DEFAULT);

高级查询操作

全量查询( matchAllQuery 
        // 查询索引中全部的数据
        SearchRequest request = new SearchRequest();
        request.indices("user");

        //构造查询条件(全量查询)
        SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        request.source(query);

        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);

        // 获取匹配到的数据
        SearchHits hits = response.getHits();

        // 总条数
        System.out.println(hits.getTotalHits());
        // 分别打印每条数据
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
条件查询( termQuery )
        // 2. 条件查询 : termQuery
        SearchRequest request = new SearchRequest();
        request.indices("user");
        //构造查询条件
        SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.termQuery("age",20));
        request.source(query);

        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
分页查询(SearchSourceBuilder.from 和 SearchSourceBuilder.to )
        SearchRequest request = new SearchRequest();
        request.indices("user");
        // 全量查询
        SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        // 构造分页条件
        query.from(0);
        query.size(2);
        request.source(query);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
排序查询( SearchSourceBuilder.sort )
        SearchRequest request = new SearchRequest();
        request.indices("user");

        //构造查询条件
        SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        query.sort("age",SortOrder.DESC);
        request.source(query);

        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        
过滤字段查询( SearchSourceBuilder.fetchSource)
        SearchRequest request = new SearchRequest();
        request.indices("user");

        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        // 选择包含/不包含某个字段
        String[] include=new String[]{"name"};
        String[] exclude=new String[]{};
        builder.fetchSource(include,exclude);

        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
多条件查询

使用:QueryBuilders.boolQuery() 

通过: 

boolQueryBuilder.must()

boolQueryBuilder.mustNot()

boolQueryBuilder.should( ) 等来指定条件

        SearchRequest request = new SearchRequest();
        request.indices("user");

        SearchSourceBuilder builder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

        boolQueryBuilder.must(QueryBuilders.matchQuery("age","20"));
        boolQueryBuilder.must(QueryBuilders.matchQuery("sex","女"));

        builder.query(boolQueryBuilder);
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
范围查询

使用:

QueryBuilders.rangeQuery(”需要范围查询的字段“)

通过:

rangeQueryBuilder.gt();

rangeQueryBuilder.gte();

rangeQueryBuilder.lt();
rangeQueryBuilder.lte();

rangeQueryBuilder.from(起始位置(闭区间));
rangeQueryBuilder.to(末位置(闭区间));  等来指定条件

 

        SearchRequest request = new SearchRequest();
        request.indices("user");

        SearchSourceBuilder builder = new SearchSourceBuilder();
        // 指定对 age 进行范围查询
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
        rangeQueryBuilder.gt(18);
        rangeQueryBuilder.lte(20);
        builder.query(rangeQueryBuilder);

        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
模糊查询

使用:

QueryBuilders.fuzzyQuery("name", "shone").fuzziness(Fuzziness.ONE);

指定需要模糊查询的名称和模糊查询的容忍度。

        SearchRequest request = new SearchRequest();
        request.indices("user");

        SearchSourceBuilder builder = new SearchSourceBuilder();
        // 要对哪个字段进行模糊查询,以及模糊查询的容忍度
        FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("name", "shone").fuzziness(Fuzziness.ONE);
        builder.query(fuzzyQueryBuilder);

        request.source(builder);

        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
高亮查询

使用:

HighlightBuilder()

通过:

HighlightBuilder.field("字段名称") 来指定要高亮的部分

        SearchRequest request = new SearchRequest();
        request.indices("user");

        SearchSourceBuilder builder = new SearchSourceBuilder();
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "shone");

        //高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<span style=\"background-color: yellow;\">");
        highlightBuilder.postTags("</span>");
        highlightBuilder.field("name");

        // 分别添加 查询 builder 和 高亮 builder
        builder.query(termQueryBuilder);
        builder.highlighter(highlightBuilder);

        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
聚合查询

通过

AggregationBuilders.max(”自定义聚合参数名称“," 需要聚合的字段 ")

AggregationBuilders.min()

AggregationBuilders.sum() 等来进行聚合

        SearchRequest request = new SearchRequest();
        request.indices("user");
        SearchSourceBuilder builder = new SearchSourceBuilder();

        // 使用聚合查询(自定义名称并且指明字段)
        AggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
        builder.aggregation(aggregationBuilder);

        request.source(builder);

        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
分组查询

通过

AggregationBuilders.terms("自定义分组名称").field("需要分组的字段")

        SearchRequest request = new SearchRequest();
        request.indices("user");

        SearchSourceBuilder builder = new SearchSourceBuilder();

        AggregationBuilder aggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
        builder.aggregation(aggregationBuilder);

        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值