Elasticsearch 7.7.0 学习springboot集成es使用,实现增删改查

Elasticsearch 7.7.0 学习springboot集成es使用,实现增删改查

导入依赖

<!-- 导入es的rest-high-level-client和elasticsearch server-->
<!-- elasticsearch 高阶版本依赖 -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.7.0</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.7.0</version>
</dependency>
复制代码

spring框架有自己的自动配置类,只要我们导入对应的依赖,比如es的依赖,那么spring框架就根据这个自己的自动配置类,将es的所有的东西都导入,之后我们就直接拿es的东西用就可以了。

配置config

@Configuration
public class ElasticSearchConfig {
​
    /**
     * 创建单例模式的RequestOptions,使得所有请求共用
     */
    public static final RequestOptions COMMON_OPTIONS;
    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
//        builder.addHeader("Authorization", "Bearer " + TOKEN);
//        builder.setHttpAsyncResponseConsumerFactory(
//                new HttpAsyncResponseConsumerFactory
//                        .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
        COMMON_OPTIONS = builder.build();
    }
​
    @Bean
    public RestHighLevelClient client() {
        RestClientBuilder builder=RestClient.builder(new HttpHost("localhost", 9200, "http"));
        RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;
    }
}
​
复制代码

将配置类导入测试类里面进行使用

1645366662059.png

//     将配置类引入,利用这个配置类里面的方法对软件进行增删改查
    @Autowired
    @Qualifier("restHighLevelClient")
    private RestHighLevelClient client;
复制代码

代码操作

1、创建索引(相当于创建数据库了)

   /**
     * 创建索引
     * @throws IOException
     */
    @Test
    void testCreateIndex() throws IOException{
        // 1、创建索引请求
        CreateIndexRequest request = new CreateIndexRequest("users");
        // 2、客户端client执行请求 IndicesClient对象,请求后获得响应
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        System.out.println(createIndexResponse);
    }
​
复制代码

创建成功后我们可以看到

1645370528222.png

2、删除索引

/**
     * 删除索引
     * @throws IOException
     */
    @Test
    void textDeleteIndex() throws IOException{
        DeleteIndexRequest request = new DeleteIndexRequest("users");
        AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(delete);
    }
复制代码

3、添加文档

 /**
     * 保存用户数据,向索引内添加文档
     */
    @Test
    public void indexData() throws IOException {
        //指定索引和id
        IndexRequest request=new IndexRequest("users");
        request.id("1");
        request.timeout("1s");
​
        //创建对象
        User user=new User("张三","男",22);
        String userString=objectMapper.writeValueAsString(user);
        request.source(userString, XContentType.JSON);
​
        //执行保存操作
        IndexResponse indexResponse=client.index(request, ElasticSearchConfig.COMMON_OPTIONS);
​
        System.out.println(indexResponse.toString());
        System.out.println(indexResponse.status());
    }
复制代码

添加文档之后我们可以看到

1645370818371.png 4、获取文档信息

 /**
     *  获取文档信息
     * @throws IOException
     */
    @Test
    void testGetDocument() throws IOException {
        GetRequest getRequest = new GetRequest("users", "1");
        GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(getResponse.getSourceAsString());
        System.out.println(getResponse);
    }
复制代码

5、更新文档

  /**
     * 更新用户数据
     */
    @Test
    public void updateData() throws IOException {
        UpdateRequest updateRequest = new UpdateRequest("users", "1");
        updateRequest.timeout("1s");
        User user = new User("张飞", "男", 25);
        String jsonString = JSONValue.toJSONString(user);
        updateRequest.doc(jsonString,XContentType.JSON);
        UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(updateResponse.status());
    }
​
复制代码

6、删除文档

/**
     * 删除文档记录
     */
    @Test
    public void deleteData() throws IOException {
        //指定索引和id
        DeleteRequest request=new DeleteRequest("users","1");
        request.timeout("1s");
​
        //执行保存操作
        DeleteResponse indexResponse=client.delete(request,ElasticSearchConfig.COMMON_OPTIONS);
        System.out.println(indexResponse.status());
    }
复制代码

7、批量插入数据,批量更新和批量删除

   /**
     * 批量插入
     * @throws IOException
     */
    @Test
    void testBulkRequest() throws IOException{
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("10s");
​
        ArrayList<Object> arrayList = new ArrayList<>();
        arrayList.add(new User("张三","男",23));
        arrayList.add(new User("李四","男",23));
        arrayList.add(new User("王五","男",23));
        arrayList.add(new User("马六","男",23));
​
        for (int i=0;i< arrayList.size();i++){
            bulkRequest.add(
                    // 批量更新和批量删除,就在这里修改对应的请求就可以了
                    new IndexRequest("users").id(""+(i+3))
                            .source(JSONValue.toJSONString(arrayList.get(i)),
                                    XContentType.JSON));
        }
        final BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulkResponse.hasFailures());
        //是否失败, 返回false 代表成功
    }
​
复制代码

8、查询

  /**
     * 复杂检索数据
     */
    @Test
    public void searchData() throws IOException {
        //1.创建检索请求
        SearchRequest searchRequest = new SearchRequest();
        //指定索引
        searchRequest.indices("users");
        //指定DSL,检索条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
​
        //1.1 构造检索条件
        //address中包含mill
        searchSourceBuilder.query(QueryBuilders.matchQuery("name", "张三"));
        //按照前10种年龄分布进行聚合
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
        searchSourceBuilder.aggregation(ageAgg);
        //求所有人年龄的平均值
        AvgAggregationBuilder ageAvg = AggregationBuilders.avg("ageAvg").field("age");
        searchSourceBuilder.aggregation(ageAvg);
​
        System.out.println(searchSourceBuilder);
        searchRequest.source(searchSourceBuilder);
​
        //2.执行检索
        SearchResponse searchResponse = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
​
        //3.分析结果
        //3.1 查看查询结果
        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit hit : searchHits) {
            System.out.println(hit);
        }
        //3.2 查看聚合结果
        Aggregations aggs = searchResponse.getAggregations();
​
        Terms ageAgg2 = aggs.get("ageAgg");
        for (Terms.Bucket bucket : ageAgg2.getBuckets()) {
            System.out.println("年龄:" + bucket.getKeyAsString()+"==> 人数:"+bucket.getDocCount());
        }
        System.out.println();
​
        Avg ageAvg2 = aggs.get("ageAvg");
        System.out.println("平均年龄:" + ageAvg2.getValue());
    }
复制代码

可以看到

1645371242344.png

image.png

猜你喜欢

转载自juejin.im/post/7077185289470345252