ElasticSearch_集成SpringBoot

ElasticSearch集成SpringBoot

1. 依赖

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

2. 新建项目

image-20201030135312316

导入依赖后我们查看SpringBoot中的ElasticSearch的版本, 发现为 7.6.2 版本, 与我们本地的 7.8.0不匹配

image-20201030135900769

一定要保证我们导入的依赖和我们ES版本一致, 在我们的POM中修改版本即可

image-20201030140238373

3. 配置对象

package com.wang.wangesapi.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ElasticSearchConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                //配置hostname和端口
                RestClient.builder(
                        new HttpHost("127.0.0.1", 9200, "http")
                )
        );
        return client;
    }
}

4. API

1. 操作索引

1. 创建索引

package com.wang.wangesapi;

import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;

@SpringBootTest
class WangEsApiApplicationTests {

   //Autowired 根据名称首字母转大写匹配类型, 这里和类型不一致,所以我们要用ID绑定
   @Autowired
   @Qualifier("restHighLevelClient")
   private RestHighLevelClient client;

   //测试索引的创建 所有的请求都使用Request创建
   @Test
   public void testCreateIndex() throws IOException {
      // 1. 创建索引请求
      CreateIndexRequest request = new CreateIndexRequest("wang_index");
      // 2. 执行创建请求 第二个参数我们一般使用默认的 RequestOptions.DEFAULT
      //indices ==> index的复数
      CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);

      System.out.println(createIndexResponse);
   }

}

2. 获取索引

// 测试获取索引
@Test
public void testExitIndex() throws IOException {
   GetIndexRequest index = new GetIndexRequest("wang_index");
   boolean exists = client.indices().exists(index, RequestOptions.DEFAULT);
   System.out.println(exists);
}

image-20201030143534879

只能判断其是否存在

3. 删除索引

// 测试删除索引
@Test
public void testDeleteIndex() throws IOException {
   DeleteIndexRequest request = new DeleteIndexRequest("wang_index");
   AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
   System.out.println(delete.isAcknowledged());
}

isAcknowledged() ==> 返回状态的布尔值

image-20201030144141190

2. 操作文档

1. 添加文档

//测试添加文档
@Test
public void testAddDocument() throws IOException {
   //创建对象
   User user = new User("张三", 12);
   //创建请求
   IndexRequest request = new IndexRequest("wang_index");
   //创建规则 put/wang_index/_doc/1
   request.id("1");
   //设置过期规则, 与 request.timeout("1s") 效果一致
   request.timeout(TimeValue.timeValueSeconds(1));
   //将我们数据放入请求 (JSON)
   IndexRequest source = request.source(JSON.toJSONString(user), XContentType.JSON);
   //客户端发送请求
   IndexResponse response = client.index(request, RequestOptions.DEFAULT);

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

2. 获取文档

首先查看文档是否存在

//获取文档, 首先判断是否存在 get/index/_doc/1
@Test
public void testIsExist() throws IOException {
   GetRequest request = new GetRequest("wang_index", "1");
   //不获取我们返回的 _source 的上下文了, 效率更高
   request.fetchSourceContext(
         new FetchSourceContext(false)
   );
   request.storedFields("_none_");

   boolean exists = client.exists(request, RequestOptions.DEFAULT);
   System.out.println(exists);
}

获取文档

//获取文档的信息
@Test
public void testGetDocument() throws IOException {
   GetRequest request = new GetRequest("wang_index", "1");
   GetResponse response = client.get(request, RequestOptions.DEFAULT);
   //打印文档的内容
   System.out.println(response.getSourceAsString());
   //返回的全内容和命令式是一样的
   System.out.println(response);
}

结果如下

image-20201030152633930

3. 更新文档

//更新文档信息
@Test
public void testUpdateDocument() throws IOException {
   UpdateRequest request = new UpdateRequest("wang_index", "1");
   request.timeout("1s");
   User user = new User("李四", 24);
   request.doc(JSON.toJSONString(user),XContentType.JSON);
   UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
   System.out.println(response.status());
}

4. 删除文档

//删除文档记录
@Test
public void testDeleteDocument () throws IOException {
   DeleteRequest request = new DeleteRequest("wang_index", "1");
   request.timeout("1s");

   DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
   System.out.println(response.status());
}

5. 批量操作

使用BulkRequest对象, 其他的和单独操作差不多

//批量导入数据
@Test
void testBulkRequest() throws IOException {
    BulkRequest bulkRequest = new BulkRequest();
    bulkRequest.timeout(TimeValue.timeValueSeconds(10));

    ArrayList<User> userList = new ArrayList<>();
    userList.add(new User("张三1号", 3));
    userList.add(new User("张三2号", 3));
    userList.add(new User("张三3号", 3));
    userList.add(new User("李四1号", 3));
    userList.add(new User("李四2号", 3));
    userList.add(new User("李四3号", 3));

    //批处理请求
    for (int i = 0; i < userList.size(); i++) {
        bulkRequest.add(
                new IndexRequest("wang_index")
                        .id("" + i)
                        .source(JSON.toJSONString(userList.get(i)), XContentType.JSON));

    }

    BulkResponse responses = client.bulk(bulkRequest, RequestOptions.DEFAULT);
    //是否存在失败的数据 ==> 返回false则说明全部插入成功!
    System.out.println(responses.hasFailures());
}

6. 查询操作

//查询
//SearchRequest 搜索请求
//SearchSourceBuilder 条件构造
//HighlightBuilder 构建高亮
//TermQueryBuilder 精确查询
//XXXXQueryBuilder 对应我们看到的所有功能
@Test
public void testSearch() throws IOException {
    SearchRequest searchRequest = new SearchRequest("wang_index");
    //构建搜索的条件
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    //查询条件, 可以使用 QueryBuilders 工具来实现
    //QueryBuilders.termQuery 精确匹配
    //QueryBuilder.matchAllQuery 匹配所有
    MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "张三1号");
    sourceBuilder.query(matchQueryBuilder)
            .timeout(TimeValue.timeValueSeconds(1))
            //分页
            .from(0).size(3);
    searchRequest.source(sourceBuilder);

    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    System.out.println(JSON.toJSONString(searchResponse.getHits()));
    System.out.println("=========================================");
    //遍历搜索结果, 取出其中的documentFields.getSourceAsMap, 就可以得到JSON MAP的结果
    for (SearchHit documentFields : searchResponse.getHits()) {
        System.out.println(documentFields.getSourceAsMap());
    }

}
posted @ 2020-10-30 16:55  山人西来  阅读(294)  评论(0编辑  收藏  举报