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());
    }
}
相关推荐
weixin_BYSJ198717 分钟前
【java项目分享】springboot阅读推荐平台10600
java·javascript·spring boot·python·django·flask·php
腾渊信息科技公司1 小时前
Spring Boot集成TDengine实战:工业时序数据存储选型与迁移方案
spring boot·后端·tdengine
zoyation1 小时前
Spring Boot集成OAuth2授权码模式的三种登录策略
java·spring boot·后端
xiaoqiMikko16 小时前
Dependabot 面板全绿,不代表你的 Tomcat 没洞
java·spring boot
摇滚侠16 小时前
SpringBoot 官网 阅读笔记 启用生产就绪功能 端点
spring boot·笔记·后端
evans在进步17 小时前
HashMap 为什么线程不安全?ConcurrentHashMap 如何解决?
java·spring boot·spring
Elasticsearch17 小时前
一个字段,覆盖所有模态:Elasticsearch 的 semantic 字段如何自动索引和搜索图像、音频、视频和 PDF
elasticsearch
Elastic 中国社区官方博客18 小时前
使用 Elasticsearch open inference API 对 OpenAI chat completions 进行支持
大数据·elasticsearch·搜索引擎·全文检索·jenkins
Elasticsearch20 小时前
jina-reranker-v3.5:通过混合 Attention 和自蒸馏实现更快的 Listwise Reranking
elasticsearch
Elasticsearch21 小时前
Elasticsearch 转型为 Agent 基础设施:混合搜索、长期记忆与工程化框架
elasticsearch