加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ElasticSearch_集成SpringBoot

发布时间:2020-12-14 04:42:16 所属栏目:百科 来源:网络整理
导读:ElasticSearch集成SpringBoot 目录 ElasticSearch集成SpringBoot 1. 依赖 2. 新建项目 3. 配置对象 4. API 1. 操作索引 1. 创建索引 2. 获取索引 3. 删除索引 2. 操作文档 1. 添加文档 2. 获取文档 3. 更新文档 4. 删除文档 5. 批量操作 6. 查询操作 1. 依赖

ElasticSearch集成SpringBoot

目录
  • ElasticSearch集成SpringBoot
    • 1. 依赖
    • 2. 新建项目
    • 3. 配置对象
    • 4. API
      • 1. 操作索引
        • 1. 创建索引
        • 2. 获取索引
        • 3. 删除索引
      • 2. 操作文档
        • 1. 添加文档
        • 2. 获取文档
        • 3. 更新文档
        • 4. 删除文档
        • 5. 批量操作
        • 6. 查询操作

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());
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读