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());
    }
}
相关推荐
captain37633 分钟前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
学长毕设3 小时前
基于SpringBoot的餐厅管理系统-附源码
java·spring boot·后端
Flynn Liang4 小时前
内存/Redis/PGVector/Milvus/ES 怎么选?Spring AI VectorStore 抽象与向量库选型对照表
redis·elasticsearch·milvus·rag·springai·pgvector·向量库
paopaokaka_luck10 小时前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
软件技术NINI11 小时前
基于SpringBoot和Vue的摇滚乐鉴赏网站
vue.js·spring boot·后端·spring·html·毕业设计·毕设
学长毕设12 小时前
基于SpringBoot的校园礼服租赁系统的设计与实现
java·spring boot·后端
计算机毕设定制辅导-无忧学长12 小时前
《基于物品协同过滤的闲置书换购微信小程序设计开发》
java·vue.js·spring boot·微信小程序·uniapp·闲置书换购微信小程序·物品协同过滤算法
Elastic 中国社区官方博客12 小时前
基于 Jina OCR v1 与 Elasticsearch 的 PDF 智能混合检索与 RAG 系统实战指南
大数据·数据库·elasticsearch·搜索引擎·ocr·jina
Best_Liu~12 小时前
SpringBoot全局日期格式化
java·spring boot·后端
RuoyiOffice12 小时前
SpringBoot3 + openGauss:RuoYi Office 登录、流程发布与用印填报适配实战
java·数据库·spring boot·opengauss·信创