springboot中使用ElasticSearch

引入依赖

修改我们的pom.xml,加入spring-boot-starter-data-elasticsearch

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

编写配置文件

由于ElasticSearch从7.x版本开始淡化TransportClient甚至于在8.x版本中遗弃,所以spring data elasticsearch推荐我们使用rest客户端RestHingLevelClient(端口号使用9200)以及接口ElasticSearchRespositoy。

  • RestHighLevelClient 更强大,更灵活,但是不能友好的操作对象
  • ElasticSearchRepository 对象操作友好
    首先我们编写配置文件如下
java 复制代码
@Configuration
public class ElasticSearchRestClientConfig extends AbstractElasticsearchConfiguration{
    
  	@Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {
        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo("192.168.8.101:9200")
                .build();
        return RestClients.create(clientConfiguration).rest();
    }

}

RestHighLevelClient方式

有了上面的rest client,我们就可以在其他的地方注入该客户端对ElasticSearch进行操作。我们新建一个测试文件,使用客户端对ElasticSearch进行基本的操作

  1. 注入RestClient
java 复制代码
/**
 * ElasticSearch Rest client操作
 *
 * RestHighLevelClient 更强大,更灵活,但是不能友好的操作对象
 * ElasticSearchRepository 对象操作友好
 *
 * 我们使用rest client 主要测试文档的操作
 **/
@SpringBootTest
public class TestRestClient {
    // 复杂查询使用:比如高亮查询
    @Autowired
    private RestHighLevelClient restHighLevelClient;
}
  1. 插入一条文档
java 复制代码
/**
 * 新增一条文档
 */
@Test
public void testAdd() throws IOException {
    /**
      * 向ES中的索引christy下的type类型中添加一天文档
      */
    IndexRequest indexRequest = new IndexRequest("christy","user","11");
    indexRequest.source("{\"name\":\"齐天大圣孙悟空\",\"age\":685,\"bir\":\"1685-01-01\",\"introduce\":\"花果山水帘洞美猴王齐天大圣孙悟空是也!\"," +
                        "\"address\":\"花果山\"}", XContentType.JSON);
    IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
    System.out.println(indexResponse.status());
}

我们可以看到文档插入成功,我们去kibana中查询该条文档

  1. 删除一条文档
java 复制代码
/**
 * 删除一条文档
 */
@Test
public void deleteDoc() throws IOException {
    // 我们把特朗普删除了
    DeleteRequest deleteRequest = new DeleteRequest("christy","user","rYBNG3kBRz-Sn-2f3ViU");
    DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
    System.out.println(deleteResponse.status());
  }
}
  1. 更新一条文档
java 复制代码
/**
 * 更新一条文档
 */
@Test
public void updateDoc() throws IOException {
    UpdateRequest updateRequest = new UpdateRequest("christy","user","p4AtG3kBRz-Sn-2fMFjj");
    updateRequest.doc("{\"name\":\"调皮捣蛋的hardy\"}",XContentType.JSON);
    UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
    System.out.println(updateResponse.status());
}
  1. 批量更新文档
java 复制代码
/**
 * 批量更新
 */
@Test
public void bulkUpdate() throws IOException {
    BulkRequest bulkRequest = new BulkRequest();
    // 添加
    IndexRequest indexRequest = new IndexRequest("christy","user","13");
    indexRequest.source("{\"name\":\"天蓬元帅猪八戒\",\"age\":985,\"bir\":\"1685-01-01\",\"introduce\":\"天蓬元帅猪八戒因调戏嫦娥被贬下凡\",\"address\":\"高老庄\"}", XContentType.JSON);
    bulkRequest.add(indexRequest);

    // 删除
    DeleteRequest deleteRequest01 = new DeleteRequest("christy","user","pYAtG3kBRz-Sn-2fMFjj");
    DeleteRequest deleteRequest02 = new DeleteRequest("christy","user","uhTyGHkBExaVQsl4F9Lj");
    DeleteRequest deleteRequest03 = new DeleteRequest("christy","user","C8zCGHkB5KgTrUTeLyE_");
    bulkRequest.add(deleteRequest01);
    bulkRequest.add(deleteRequest02);
    bulkRequest.add(deleteRequest03);

    // 修改
    UpdateRequest updateRequest = new UpdateRequest("christy","user","10");
    updateRequest.doc("{\"name\":\"炼石补天的女娲\"}",XContentType.JSON);
    bulkRequest.add(updateRequest);

    BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
    BulkItemResponse[] items = bulkResponse.getItems();
    for (BulkItemResponse item : items) {
      System.out.println(item.status());
    }
}
  1. 查询文档
java 复制代码
@Test
public void testSearch() throws IOException {
    //创建搜索对象
    SearchRequest searchRequest = new SearchRequest("christy");
    //搜索构建对象
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    searchSourceBuilder.query(QueryBuilders.matchAllQuery())//执行查询条件
      .from(0)//起始条数
      .size(10)//每页展示记录
      .postFilter(QueryBuilders.matchAllQuery()) //过滤条件
      .sort("age", SortOrder.DESC);//排序

    //创建搜索请求
    searchRequest.types("user").source(searchSourceBuilder);

    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

    System.out.println("符合条件的文档总数: "+searchResponse.getHits().getTotalHits());
    System.out.println("符合条件的文档最大得分: "+searchResponse.getHits().getMaxScore());
    SearchHit[] hits = searchResponse.getHits().getHits();
    for (SearchHit hit : hits) {
      System.out.println(hit.getSourceAsMap());
    }
}
相关推荐
大梦百万秋2 分钟前
Spring Boot实战:构建一个简单的RESTful API
spring boot·后端·restful
LI JS@你猜啊23 分钟前
Elasticsearch 集群
大数据·服务器·elasticsearch
斌斌_____30 分钟前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
苹果醋31 小时前
React系列(八)——React进阶知识点拓展
运维·vue.js·spring boot·nginx·课程设计
等一场春雨3 小时前
springboot 3 websocket react 系统提示,选手实时数据更新监控
spring boot·websocket·react.js
荆州克莱4 小时前
Golang的性能监控指标
spring boot·spring·spring cloud·css3·技术
AI人H哥会Java4 小时前
【Spring】控制反转(IoC)与依赖注入(DI)—IoC容器在系统中的位置
java·开发语言·spring boot·后端·spring
赖龙4 小时前
springboot restful mybatis连接mysql返回日期格式不对
spring boot·mybatis·restful
自律的kkk4 小时前
SpringBoot中使用AOP切面编程实现登录拦截
java·spring boot·aop·切面编程·登录拦截
武昌库里写JAVA4 小时前
【MySQL】MySQL 通过127.0.0.1和localhost登录的区别
spring boot·spring·毕业设计·layui·课程设计