ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**1. 封装一个实体类** ```java @Data @Builder @NoArgsConstructor @AllArgsConstructor @Document(indexName = "product", shards = 3, replicas = 1) public class Product { /** 产品唯一标识 */ @Id private Long id; /** 产品名称 */ @Field(type = FieldType.Text) private String title; /** 产品品牌 */ @Field(type = FieldType.Keyword) private String brand; /** 产品价格 */ @Field(type = FieldType.Double) private Double price; /** 产品图片地址 */ @Field(type = FieldType.Text, index = false) private String images; } ``` **2. 继承接口ElasticsearchRepository** ```java /** * 继承接口ElasticsearchRepository<实体类, 实体类中的ID类型>,便可以调用接口的 * 方法与Elasticsearch交互了。 * * 在接口中声明的方法的方法名是有一定规律的, * 查询以 find开始、新增和更新以save开始、删除以delete开始、统计以count开始、存在exists开始。 * 声明一个方法按照从左到右编写的话,IDEA是可以给出参考的方法名的。 */ @Repository public interface ProductDao extends ElasticsearchRepository<Product, Long> { /** 根据产品名称查询产品 */ List<Product> findByTitle(String title); /** 查询价格在[price1, price2]之间的产品 */ List<Product> findByPriceBetween(double price1, double price2); /** 根据品牌查询 */ List<Product> findByBrand(String brand); /** 根据品牌查询,然后按照价格降序排序 */ List<Product> findByBrandOrderByPriceDesc(String brand); /** 根据品牌与价格区间查询 */ List<Product> findByBrandAndPriceBetween(String brand, double price1, double price2); } ``` 更过命名规则参考官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/4.2.6/reference/html/#elasticsearch.query-methods.criterions **3. 调用接口中的方法** ```java @RunWith(SpringRunner.class) @SpringBootTest(classes = {SpringDataEsApplication.class}) public class ProductControllerTest { @Autowired private ProductDao productDao; /** * 新增或更新。 * 新增与更新都是调用save方法,没有该条数据时是新增,已经有了就是更新。 */ @Test public void saveDocument() { Product product = Product.builder() .id(1001L) .title("华为 Mate 40 Pro 4G版") .brand("华为") .price(5899.0d) .images("https://res.xx455CB694209CB8A2mp.png") .build(); Product result = productDao.save(product); } /** * 删除文档。 */ @Test public void deleteDocument() { Product product = Product.builder().id(1001L).build(); productDao.delete(product); } /** * 批量新增文档。//调用deleteAll便可实现批量删除 */ @Test public void saveAll() { List<Product> products = new ArrayList<>(); products.add(new Product(1001L, "华为 Mate 30 Pro 4G版", "华为", 1000.0d, "http://1.jpg")); products.add(new Product(1002L, "华为 Mate 40 Pro 4G版", "华为", 2000.0d, "http://2.jpg")); products.add(new Product(1003L, "华为 Mate 50 Pro 4G版", "华为", 3000.0d, "http://3.jpg")); Iterable<Product> iterable = productDao.saveAll(products); } /** * 查询所有。 * 根据id字段升序排序 */ @Test public void findAll() { Iterable<Product> iterable = productDao.findAll(Sort.by(Sort.Direction.ASC, "id")); iterable.forEach(product -> { System.out.println(product.toString()); }); //Product(id=1001, title=华为 Mate 30 Pro 4G版, brand=华为, price=1000.0, images=http://1.jpg) //Product(id=1002, title=华为 Mate 40 Pro 4G版, brand=华为, price=2000.0, images=http://2.jpg) //Product(id=1003, title=华为 Mate 50 Pro 4G版, brand=华为, price=3000.0, images=http://3.jpg) } /** * 根据id查询产品 */ @Test public void findById() { Product product = Product.builder().id(1001L).build(); Product result = productDao.findById(product.getId()).get(); System.out.println(result); //Product(id=1001, title=华为 Mate 30 Pro 4G版, brand=华为, price=1000.0, images=http://1.jpg) } /** * 按照产品名称查询。 */ @Test public void findByTitle() { List<Product> products = productDao.findByTitle("华为 Mate 30 Pro 4G版"); products.forEach(System.out::println); //Product(id=1001, title=华为 Mate 30 Pro 4G版, brand=华为, price=1000.0, images=http://1.jpg) } /** * 按照价格区间查询。 */ @Test public void findByPriceBetween() { List<Product> products = productDao.findByPriceBetween(1000, 3000); products.forEach(System.out::println); //Product(id=1002, title=华为 Mate 40 Pro 4G版, brand=华为, price=2000.0, images=http://2.jpg) //Product(id=1003, title=华为 Mate 50 Pro 4G版, brand=华为, price=3000.0, images=http://3.jpg) //Product(id=1001, title=华为 Mate 30 Pro 4G版, brand=华为, price=1000.0, images=http://1.jpg) } /** * 按照品牌查询。 */ @Test public void findByBrand() { List<Product> products = productDao.findByBrand("华为"); products.forEach(System.out::println); //Product(id=1002, title=华为 Mate 40 Pro 4G版, brand=华为, price=2000.0, images=http://2.jpg) //Product(id=1003, title=华为 Mate 50 Pro 4G版, brand=华为, price=3000.0, images=http://3.jpg) //Product(id=1001, title=华为 Mate 30 Pro 4G版, brand=华为, price=1000.0, images=http://1.jpg) } /** *按照品牌查询,然后按照价格降序排序 */ @Test public void findByBrandOrderByPriceDesc() { List<Product> products = productDao.findByBrandOrderByPriceDesc("华为"); products.forEach(System.out::println); //Product(id=1003, title=华为 Mate 50 Pro 4G版, brand=华为, price=3000.0, images=http://3.jpg) //Product(id=1002, title=华为 Mate 40 Pro 4G版, brand=华为, price=2000.0, images=http://2.jpg) //Product(id=1001, title=华为 Mate 30 Pro 4G版, brand=华为, price=1000.0, images=http://1.jpg) } /** * 根据品牌与价格区间查询。 */ @Test public void findByBrandAndPriceBetween() { List<Product> products = productDao.findByBrandAndPriceBetween("华为", 2000, 3000); products.forEach(System.out::println); //Product(id=1002, title=华为 Mate 40 Pro 4G版, brand=华为, price=2000.0, images=http://2.jpg) //Product(id=1003, title=华为 Mate 50 Pro 4G版, brand=华为, price=3000.0, images=http://3.jpg) } /** * 分页查询 */ @Test public void findByPageable() { //根据价格降序排序 Sort sort = Sort.by(Sort.Direction.DESC, "price"); int currentPage = 0; //从第0页开始 int pageSize = 2; //每一页显示2条数据 PageRequest request = PageRequest.of(currentPage, pageSize, sort); Page<Product> products = productDao.findAll(request); products.forEach(System.out::println); //Product(id=1003, title=华为 Mate 50 Pro 4G版, brand=华为, price=3000.0, images=http://3.jpg) //Product(id=1002, title=华为 Mate 40 Pro 4G版, brand=华为, price=2000.0, images=http://2.jpg) } } ```