【ElasticSearch】sping框架集成
各位小伙伴们大家好,欢迎来到这个小扎扎的ElasticSearch专栏,本篇博客由B战尚硅谷的ElasticSearch视频总结而来,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛
🌆 内容速览
- 1 项目搭建
- 2 文件修改
- 3 类创建
- 4 索引、文档操作
- 4.1 索引操作
- 4.2 文档操作
1 项目搭建
创建maven项目
删除不必要文件
maven配置
JDK配置
2 文件修改
pom文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
<relativePath/>
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<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=ip
# es 服务端口
elasticsearch.port=端口
# 配置日志级别,开启 debug 日志
logging.level.主程序所在包名=debug
3 类创建
domain实体类
🚩 @Document 注解指定索引名称(indexName)、分片数量(shards)、副本分片数量(replicas)
🚩 @Id 注解指定文档id
🚩 @Field 注解指定字段类型(type)、分词器类型(analyzer)、是否被索引(index)
analyzer = “ik_max_word” 表示使用做大粒度的分词器,会将字段拆分成最小的词条
index = false 表示该字段不可以被检索
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Document(indexName = "product", shards = 3, replicas = 1)
public class Product {
/**
* 商品唯一标识
*/
@Id
private Long id;
/**
* 商品名称
*/
@Field(type = FieldType.Text, analyzer = "ik_max_word")
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;
}
config配置类
🚩 @ConfigurationProperties(prefix = “elasticsearch”) 与配置文件中的变量进行绑定,前缀为"elasticsearch"且下面变量名相同的会尽心值的绑定
@ConfigurationProperties(prefix = "elasticsearch")
@Configuration
@Data
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
private String host ;
private Integer port ;
/**
* 重写父类方法
* @return
*/
@Override
public RestHighLevelClient elasticsearchClient() {
RestClientBuilder builder = RestClient.builder(new HttpHost(host, port));
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);
return restHighLevelClient;
}
}
dao操作类
@Repository
public interface ProductDao extends ElasticsearchRepository<Product,Long> {
}
4 索引、文档操作
4.1 索引操作
🚩 由于之前再实体类使用@Document 注解指定索引名称(indexName)、分片数量(shards)、副本分片数量(replicas);于是当项目启动的时候就会根据配置去创建对应的索引
public class SpringDataESIndexTest {
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
@Test
public void createIndex(){
//创建索引,系统初始化会自动创建索引
System.out.println("创建索引");
}
@Test
public void deleteIndex(){
//删除索引
boolean flg = elasticsearchRestTemplate.indexOps(Product.class).delete();
System.out.println("删除索引 = " + flg);
}
}
4.2 文档操作
新增、修改
/**
* 新增
*/
@Test
public void save(){
Product product = new Product();
product.setId(2L);
product.setTitle("华为手机");
product.setCategory("手机");
product.setPrice(2999.0);
product.setImages("http://www.atguigu/hw.jpg");
productDao.save(product);
}
/**
* 修改、id相同覆盖的方式
*/
@Test
public void update(){
Product product = new Product();
product.setId(1L);
product.setTitle("小米 2 手机");
product.setCategory("手机");
product.setPrice(9999.0);
product.setImages("http://www.atguigu/xm.jpg");
productDao.save(product);
}
删除
@Test
public void delete(){
Product product = new Product();
product.setId(1L);
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.setCategory("手机");
product.setPrice(1999.0+i);
product.setImages("http://www.atguigu/xm.jpg");
productList.add(product);
}
productDao.saveAll(productList);
}
根据 id 查询
/**
* 这里为了防止id不存在,捕获一下NoSuchElementException异常
*/
@Test
public void findById(){
try {
Product product = productDao.findById(2L).get();
System.out.println(product);
} catch (NoSuchElementException e) {
System.out.println(e.getMessage());
}
}
查询所有
@Test
public void findAll(){
Iterable<Product> products = productDao.findAll();
for (Product product : products) {
System.out.println(product);
}
}
分页查询
@Test
public void findByPageable(){
//设置排序(排序方式,正序还是倒序,排序的 id)
Sort sort = Sort.by(Sort.Direction.DESC,"id");
//当前页,第一页从 0 开始,1 表示第二页
int currentPage=0;
//每页显示多少条
int pageSize = 5;
//设置查询分页
PageRequest pageRequest = PageRequest.of(currentPage, pageSize,sort);
//分页查询
Page<Product> productPage = productDao.findAll(pageRequest);
for (Product Product : productPage.getContent()) {
System.out.println(Product);
}
}