springboot整合ElasticSearch 使用elasticsearchTemplate和elasticsearchRepository两种方式

博客介绍了Spring Boot整合ES的依赖使用方法。一是使用elasticsearchRepository,以操作repository方式操作ES,创建实体类、dao层,继承相关接口即可,不了解ES的开发者也能简单使用;二是使用elasticsearchTemplate,可直接注入,还提及想详细了解client使用可查看其常用操作API。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot整合ES的依赖

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
spring.data.elasticsearch.cluster-name=my-application
spring.data.elasticsearch.cluster-nodes=localhost:9300
spring.data.elasticsearch.repositories.enabled=true

1.使用elasticsearchRepository

这种方式简单方便,以操作repository的方式操作ES 不了解ES的开发者也可以简单使用

创建实体类,

指定index(数据库)  type(数据库中的表) 分片和副本不是必须的

@Document(indexName = "book",type = "book", shards = 1,replicas = 0, refreshInterval = "-1")
public class Book {
    //注意 实现的实体类必须指定id属性 不然会报异常
    private Integer id;
    private String bookName;
    private String author;
    private String publish;
    private Integer price;

    
    //  setXXX()和getXXX()

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookName='" + bookName + '\'' +
                ", author='" + author + '\'' +
                ", publish='" + publish + '\'' +
                ", price=" + price +
                '}';
    }

}

创建dao层

只需要继承ElasticSearchRepository<Book,String>的接口  不需要自己去实现接口

接口上 可以不使用任何注解(如:@Repository)

public interface BookRepository extends ElasticsearchRepository<Book, String> {
    List<Book> findByPrice(Integer price);
}

测试类。。。 

@RunWith(SpringRunner.class)
@SpringBootTest
public class ElasticsearchApplicationTests {

    @Autowired
    BookRepository bookRepository;

    @Test
    public  void  test1(){
        Book book=new Book();
        book.setAuthor("张三");
        book.setBookName("javv从入门到放弃");
        book.setPrice(24);
        book.setPublish("出版社");
        bookRepository.save(book);
        Iterable<Book> all = bookRepository.findAll();
        Iterator<Book> iterator = all.iterator();
        while(iterator.hasNext()) {
            Book next = iterator.next();
            System.out.println(next);
        }
    }
}

2.使用elasticsearchTemplate

直接注入elasticsearchTemplate

  @Autowired
    ElasticsearchTemplate elasticsearchTemplate;
   @Test
   public void test2(){
       Client client = elasticsearchTemplate.getClient();
       GetResponse response = client.prepareGet("index", "type", "id").get();
       System.out.println(response.getSource());
   }

以上只是简单的使用  elasticsearchTemplate方式的  如果想详细了解client的使用 -->  client的常用操作API

 

 

 

### Spring Boot 集成 Elasticsearch使用 ElasticsearchRepository 的方法 在某些场景下,开发者可能希望绕过 `ElasticsearchRepository` 来更灵活地控制与 Elasticsearch 的交互。这种情况下可以直接使用 `RestHighLevelClient` 或者其替代品(如 `ElasticsearchClient`),并通过手动构建请求解析响应的方式实现功能。 #### 添加 Maven 依赖 无论是否使用 `ElasticsearchRepository`,都需要先引入必要的依赖项[^4]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <!-- 如果需要直接操作 RestHighLevelClient --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.10.2</version> </dependency> ``` 注意版本号应匹配所使用Elasticsearch 版本。 --- #### 自定义配置类 创建一个配置类来初始化客户端实例,并将其注入到 Spring 容器中[^4]: ```java @Configuration public class ElasticsearchConfig { @Value("${elasticsearch.host}") private String host; @Value("${elasticsearch.port}") private int port; @Bean public RestHighLevelClient restHighLevelClient() { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "password")); RestClientBuilder builder = RestClient.builder( new HttpHost(host, port, "http")) .setHttpClientConfigCallback(httpAsyncClientBuilder -> httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider)); return new RestHighLevelClient(builder); } } ``` 这里假设 Elasticsearch 是通过 HTTP 协议暴露服务的;如果启用了认证机制,则需额外设置凭证信息。 --- #### 实现索引操作 接下来演示如何不借助于 Repository 接口完成一些基础的操作,比如新增文档、查询文档等。 ##### 新增文档 以下代码片段展示了如何向指定索引插入一条记录[^1]: ```java @Service public class ElasticsearchService { private final RestHighLevelClient client; public ElasticsearchService(RestHighLevelClient client) { this.client = client; } public void addDocument(String indexName, Map<String, Object> document) throws IOException { IndexRequest request = new IndexRequest(indexName).source(document, XContentType.JSON); IndexResponse response = client.index(request, RequestOptions.DEFAULT); log.info("Indexed with version {}", response.getVersion()); } } ``` 调用时传入目标索引名称以及待存入的数据即可。 ##### 查询文档 同样也可以构造 GET 请求读取已存在的资源[^3]: ```java public Optional<Map<String, Object>> getDocumentById(String indexName, String id) throws IOException { GetRequest getRequest = new GetRequest(indexName, id); try (GetResponse response = client.get(getRequest, RequestOptions.DEFAULT)) { if (!response.isExists()) { return Optional.empty(); } return Optional.ofNullable(response.getSourceAsMap()); } } ``` 此函数返回的结果要么为空表示找不到对应 ID 的条目,要么包含具体的键值对集合代表找到的内容。 --- #### 删除文档 删除动作相对简单直白一点[^1]: ```java public boolean deleteDocument(String indexName, String id) throws IOException { DeleteRequest request = new DeleteRequest(indexName, id); DeleteResponse response = client.delete(request, RequestOptions.DEFAULT); return response.getResult() != DocWriteResponse.Result.NOT_FOUND; } ``` 依据结果判断是否成功移除某对象。 --- #### 更新现有文档 更新部分字段而非完全替换整份文档的情况也很常见: ```java public void updateDocumentPartially(String indexName, String id, Map<String, Object> updates) throws IOException { UpdateRequest request = new UpdateRequest(indexName, id) .fetchSource(true) .doc(updates, XContentType.JSON); UpdateResponse response = client.update(request, RequestOptions.DEFAULT); log.debug("Updated document at version {}.", response.getVersion()); } ``` 上述例子仅修改传递过来的部分属性而不影响其他未提及之处。 --- ### 结论 虽然采用原生 API 编写起来稍微复杂些,但它赋予了程序员更大的自由度去定制化行为模式。对于那些追求极致性能优化或者特殊需求满足的应用场合来说尤为适用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值