1.安装依赖
创建springboot工程,引入如下依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
</dependencies>
在application.properties进行配置
# es 服务地址 elasticsearch.host=127.0.0.1 # es 服务端口 elasticsearch.port=9200 # 配置日志级别,开启 debug 日志 logging.level.com.gh.springbootes=debug
2.编写配置类
package com.gh.springbootes.config; import lombok.Data; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; /** * @Author Eric * @Date 2021/7/27 10:40 * @Version 1.0 */ @ConfigurationProperties(prefix = "elasticsearch") @Configuration @Data public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { private String host; private Integer port; @Override public RestHighLevelClient elasticsearchClient() { RestClientBuilder builder = RestClient.builder(new HttpHost(host, port)); RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder); return restHighLevelClient; } }
3.编写实体类
编写实体类Product,设置哪些查询规则
package com.gh.springbootes; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; /** * @Author Eric * @Date 2021/7/27 10:37 * @Version 1.0 */ @Data @AllArgsConstructor @NoArgsConstructor @ToString @Document(indexName = "product",shards = 3,replicas = 1)//shards主分片replicas副本 public class Product { @Id private Long id;//商品唯一标识 @Field(type = FieldType.Text) private String title;//商品名称 @Field(type = FieldType.Keyword) private String category;//分类名称 @Field(type = FieldType.Double) private Double price;//商品价格 @Field(type = FieldType.Keyword,index = false) private String images;//图片地址 }
4.编写Dao层
编写ProductDao继承ElasticsearchRepository,第一个参数代表实体类,第二个代表主键
package com.gh.springbootes.dao; import com.gh.springbootes.Product; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface ProductDao extends ElasticsearchRepository<Product,Long> { }
5.操作elasticsearch
5.1 索引操作
package com.gh.springbootes; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; @SpringBootTest class SpringbootEsApplicationTests { @Autowired private ElasticsearchRestTemplate elasticsearchRestTemplate; @Test public void createIndex(){ //创建索引,系统初始化会自动创建索引 System.out.println("创建索引成功"); } @Test public void deleteIndex(){ //删除索引 elasticsearchRestTemplate.deleteIndex(Product.class); System.out.println("删除索引成功"); } }
5.2 文档操作
package com.gh.springbootes; import com.gh.springbootes.dao.ProductDao; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import java.util.ArrayList; import java.util.List; /** * @Author Eric * @Date 2021/7/27 11:12 * @Version 1.0 */ @SpringBootTest public class SpringDataEsProductDaoTest { @Autowired private ProductDao productDao; /** * 新增 */ @Test public void save() { Product product = new Product(); product.setId(3L); product.setTitle("华为手机"); product.setCategory("手机"); product.setPrice(2999.00); product.setImages("http://www.gh.com"); productDao.save(product); } /** * 修改 */ @Test public void update() { Product product = new Product(); product.setId(2L); product.setTitle("小米手机"); product.setCategory("手机"); product.setPrice(2997.00); product.setImages("http:www.gh.com"); productDao.save(product); } /** * 根据id查询 */ @Test public void findById() { Product product = productDao.findById(2L).get(); System.out.println(product); } /** * 查询所有 */ @Test public void findAll() { productDao.findAll().forEach(product -> { System.out.println(product); }); } /** * 删除 */ @Test public void delete() { Product product = new Product(); product.setId(2L); productDao.delete(product); } /** * 批量新增 */ @Test public void saveAll() { List<Product> productList = new ArrayList<>(); for (int i = 0; i < 10; i++) { Product product = new Product(); product.setId(Long.valueOf(i)); product.setTitle("[" + i + "]小米手机"); product.setPrice(1999.00 + i); product.setImages("http://www.gh.com"); product.setCategory("手机"); productList.add(product); } productDao.saveAll(productList); } /** * 分页查询 */ @Test public void findByPage() { //设置排序规则 Sort sort=Sort.by(Sort.Direction.DESC,"id"); int currentPage=0;//当前页 int pageSize=5;//每页显示的数据 PageRequest pageRequest=PageRequest.of(currentPage,pageSize,sort); Page<Product> productPage = productDao.findAll(pageRequest); for (Product product : productPage) { System.out.println(product); } } }
5.3 文档查询
package com.gh.springbootes; import com.gh.springbootes.dao.ProductDao; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.TermQueryBuilder; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.PageRequest; /** * @Author Eric * @Date 2021/7/27 12:08 * @Version 1.0 */ @SpringBootTest public class SpringDataEsSearchTest { @Autowired private ProductDao productDao; /** * term查询 */ @Test public void termQuery() { TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category", "手机"); productDao.search(termQueryBuilder).forEach(product -> { System.out.println(product); }); } /** * term分页查询 */ @Test public void termPageQuery() { int page = 0; int limit = 5; PageRequest pageRequest = PageRequest.of(page, limit); TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category", "手机"); productDao.search(termQueryBuilder, pageRequest).forEach(product -> { System.out.println(product); }); } }