springboot整合ElasticSearch(ES)

本文章介绍ElasticSearch的使用 crud 分页查询 高亮显示

开始之前还要准备ElasticSearch的服务,和ik分词器
ik分词器下载路径:https://github.com/medcl/elasticsearch-analysis-ik/
elasticsearch下载路径:https://www.elastic.co/cn/downloads/elasticsearch

第一步在打开elasticSearch目录下的plugins在里面创建一个ik的文件,名字好像必须叫这个,在将下载好的ik分词器文件打开将里面的全部文件复制到刚刚创建的ik文件下,然后重启es服务,版本最好一致

在这里插入图片描述

创建springboot项目,我的版本是2.2.5.RELEASE

导入Maven依赖

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-datelasticsearch</artifactId>
    <version>7.6.2</version>
 </dependency>
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.70</version>
</dependency>

配置连接参数

可以再application.yml配置,也可以写个配置文件用代码实现

1.application.yml实现

spring:
  elasticsearch:
    rest:
      uris: 127.0.0.1:9200

2.通过代码代码实现

@Configuration
public class ElasticsearchSearchClientConfig {
    @Bean
    public RestHighLevelClient restHighLevelClient() {
        return new RestHighLevelClient(
                RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));
    }
}

开始实现crud操作

建立一个单元测试的类,在这里熟悉一下api的使用

建立一个索引

@SpringBootTest
class SpringbootEsApiApplicationTests {
    @Autowired
    @Qualifier("restHighLevelClient")
    private RestHighLevelClient client;
    
	//创建一个索引 类似于创建一个库
    @Test
    void contextLoads() throws IOException {
        CreateIndexRequest request = new CreateIndexRequest("users");
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        System.out.println(createIndexResponse);

    }
  }
  

一般不报错就算创建成功 还是去看看有没有创建成功 以免后面测试都不知道为什么报错
在这里插入图片描述
在这里插入图片描述

测试索引是否存在

	//测试索引是否存在
    @Test
    void testExistIndex() throws IOException {
        GetIndexRequest request = new GetIndexRequest("users");
        boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println(exists); //返回true or  false
    }

删除索引

    @Test
    void testDeleteIndex() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("users");
        //删除
        AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
         //查看索引是否删除成功,成功则返回true
        System.out.println(delete.isAcknowledged());
    }

给索引里面添加文档

   //测试添加文档
    @Test
    void testAddDocument() throws IOException {
        // 创建对象
        User user = new User("张三", 3);
        // 创建请求
        IndexRequest request = new IndexRequest("users");
        // 规则 put /kuang_index/_doc/1
        request.id("3");
        request.timeout(TimeValue.timeValueSeconds(1));
        request.timeout("1s");
        // 将我们的数据放入请求 json
        request.source(JSON.toJSONString(user), XContentType.JSON);
        try {
            // 客户端发送请求 , 获取响应的结果
            IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
            System.out.println(indexResponse.toString()); //
            System.out.println(indexResponse.status()); // 对应我们命令返回的状态CREATED
        } catch (Exception e) {
            String msg = e.getMessage();
            if (!msg.contains("201 Created") && !msg.contains("200 OK")) {
                throw e;
            }
        }

    }

去看数据有没有添加成功

在这里插入图片描述

判断文档是否存在

  // 获取文档,判断是否存在 get /index/doc/1
    @Test
    void testIsExists() throws IOException {
        GetRequest getRequest = new GetRequest("users", "3");
        // 不获取返回的 _source 的上下文了
        getRequest.fetchSourceContext(new FetchSourceContext(false));
        getRequest.storedFields("_none_");//不要排序的字段
        boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

获取文档添加的数据

	// 获得文档的信息
    @Test
    void testGetDocument() throws IOException {
        GetRequest getRequest = new GetRequest("users", "3");
        GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(getResponse.getSourceAsString()); // 打印文档的内容
        System.out.println(getResponse); // 返回的全部内容和命令式一样的
    }

更新文档数据

    // 更新文档的信息
    @Test
    void testUpdateRequest() throws IOException {
        UpdateRequest updateRequest = new UpdateRequest("users", "1");
        updateRequest.timeout("1s");
        User user = new User("Java之父就是牛", 70);
        updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
        try {
            UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
            System.out.println(updateResponse.status());
        } catch (Exception e) {
            String msg = e.getMessage();
            if (!msg.contains("201 Created") && !msg.contains("200 OK")) {
                throw e;
            }
        }
    }

删除文档记录

    // 删除文档记录
    @Test
    void testDeleteRequest() throws IOException {
        DeleteRequest request = new DeleteRequest("users", "3");
        request.timeout("1s");
        try {
            DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);
            System.out.println(deleteResponse.status());
        } catch (Exception e) {
            String msg = e.getMessage();
            if (!msg.contains("201 Created") && !msg.contains("200 OK")) {
                throw e;
            }
        }
    }

批量crud操作

我只写了一个批量添加 ,因为其他操作都差不多 改改请求参数就行

  @Test
    void testBulkRequest() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("10s");
        ArrayList<User> userList = new ArrayList<>();
        userList.add(new User("ceshi1", 3));
        userList.add(new User("ceshi12", 3));
        userList.add(new User("zhangsan3", 3));
        userList.add(new User("lisi2", 3));
        userList.add(new User("wangwu6", 3));
        userList.add(new User("zhaoliu7", 3));
        // 批处理请求
        for (int i = 0; i < userList.size(); i++) {
            // 批量更新和批量删除,就在这里修改对应的请求就可以了
            bulkRequest.add(new IndexRequest("users").id("" + (i + 1)) //不给id的系统会自动生成
                    .source(JSON.toJSONString(userList.get(i)), XContentType.JSON));
        }
        BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulkResponse.hasFailures()); // 是否失败,返回 false 代表 成功!
    }

在这里插入图片描述

查询

 // 查询
    // SearchRequest 搜索请求
    // SearchSourceBuilder 条件构造
    // HighlightBuilder 构建高亮
    // TermQueryBuilder 精确查询
    // MatchAllQueryBuilder
    // xxx QueryBuilder 对应我们刚才看到的命令!
    @Test
    void testSearch() throws IOException {
        SearchRequest searchRequest = new SearchRequest("users");
        // 构建搜索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.highlighter();
        // 查询条件,我们可以使用 QueryBuilders 工具来实现
        // QueryBuilders.termQuery 精确
        // QueryBuilders.matchAllQuery() 匹配所有
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("username", "ceshi1");
        // MatchAllQueryBuilder matchAllQueryBuilder =
        QueryBuilders.matchAllQuery();
        sourceBuilder.query(termQueryBuilder);
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(JSON.toJSONString(searchResponse.getHits()));
        System.out.println("=================================");
        for (SearchHit documentFields : searchResponse.getHits().getHits()) {
            System.out.println(documentFields.getSourceAsMap());
        }
    }

到这里es的curd对应的api就展示完了,后面应该会做一个小项目的demo吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值