Spring Data是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的开源框架。
Spring Data Elasticsearch提供了与Elasticsearch搜索引擎的集成,Spring Data Elasticsearch的核心是以一个实体类为中心的模型,用于实现与es的交互。
注意:Spring Data尚未集成8.x版本的Elasticsearch,在使用Spring Data Elasticsearch4.3.x版本时,要使用7.15.2版本的Elasticsearch。
Elasticsearch7.15.2下载地址:es7.5.12官网下载地址
版本对应关系表
Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework | Spring Boot |
---|---|---|---|---|
2021.1(Q) | 4.3.x | 7.15.2 | 5.3.x | 2.5.x |
2021.0(Pascal) | 4.2.x | 7.12.0 | 5.3.x | 2.5.x |
2020.0(Ockham) | 4.1.x | 7.9.3 | 5.3.2 | 2.4.x |
Neumann | 4.0.x | 7.6.2 | 5.2.12 | 2.3.x |
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
├src
├─main
│ ├─java
│ │ └─com
│ │ └─demo
│ │ ├─config
│ │ ├─dao
│ │ └─domain
│ └─resources
│ ├─static
│ └─templates
└─test
└─java
└─com
└─demo
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("localhost:9200")
.build();
return RestClients.create(clientConfiguration).rest();
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document(indexName = "product")
public class Product {
@Id
private Long id;
@Field(type = FieldType.Text)
private String name;
@Field(type = FieldType.Double)
private Double price;
// Keyword表示不使用分词
@Field(type = FieldType.Keyword)
private String category;
}
目的是继承官方封装好的一些方法,在使用时从Spring容器中直接拿出来bean对象调用父类方法。
@Repository
public interface ProductDao extends ElasticsearchRepository<Product, Long> {
}
@SpringBootTest
class EsSpringbootDemoApplicationTests {
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
@Test
public void createIndex() {
// 系统初始化会自动扫描实体类中的@Document注解创建索引
System.out.println("索引创建成功");
}
@Test
public void existsIndex() {
// 因为初始化时就会自动创建索引,所以返回值永远为true
boolean flag = elasticsearchRestTemplate.indexOps(IndexCoordinates.of("product")).exists();
System.out.println("flag = " + flag);
}
@Test
public void deleteIndex() {
// 删除之后可使用Kibana查看索引情况
boolean flag = elasticsearchRestTemplate.indexOps(IndexCoordinates.of("product")).delete();
System.out.println("flag = " + flag);
}
}
@SpringBootTest
class EsSpringbootDemoApplicationTests {
@Autowired
private ProductDao productDao;
@Test
public void save() {
// 新增文档数据
Product product = new Product(1001L, "小米11", 4999.00, "手机");
productDao.save(product);
}
@Test
public void saveAll() {
// 批量插入
List<Product> list = new ArrayList<>();
for (int i = 1; i < 10; i++) {
Product product = new Product();
product.setId(Long.valueOf(i));
product.setName("小米" + i);
product.setPrice(999.00 + i * 100);
product.setCategory("手机");
list.add(product);
}
productDao.saveAll(list);
}
@Test
public void modify() {
// 修改文档数据,id相同
Product product = new Product(1001L, "小米12", 6999.00, "手机");
productDao.save(product);
}
@Test
public void findById() {
// 根据id查询,需要传入一个Long类型的参数
Product product = productDao.findById(1001L).get();
System.out.println("product = " + product);
}
@Test
public void findAll() {
// 查询所有
Iterable<Product> all = productDao.findAll();
all.forEach(f -> System.out.println(f));
}
@Test
public void findByPageable() {
// 分页查询
int page = 0;
int size = 5;
PageRequest pageRequest = PageRequest.of(page, size);
productDao.findAll(pageRequest).forEach(f -> System.out.println(f));
}
@Test
public void delete() {
// 删除数据
Product product = new Product();
product.setId(1001L);
productDao.delete(product);
}
@Test
public void deleteById() {
// 根据id删除数据
productDao.deleteById(1001L);
}
}