目录
SpringData操作elasticsearch的思路
Spring Data 的强大之处,就在于不用写任何DAO处理,自动根据方法名或类的信息进行CRUD操作。只要定义一个接口,然后继承Repository提供的一些子接口,就能具备各种基本的CRUD功能。
定义Repository接口
接口位置
让它继承ElasticsearchRepository
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
}
继承之后我们就可以用CRUD方法了
使用Repository操作Elasticsearch
我们需要先在test测试类中注入respository
@Autowired
private ItemRepository itemRepository;
然后确保pojo类里面有item的无参构造方法,和所有对象有参数的构造方法
package cn.itcast.elasticsearch.pojo;
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;
@Document(indexName = "item", type="docs", shards = 1,replicas = 0)
public class Item {
@Id
Long id;
/**
* 标题
*/
@Field(type = FieldType.Text, analyzer = "ik_max_word")
String title;
/**
* 分类
*/
@Field(type = FieldType.Keyword)
String category;
/**
* 品牌
*/
@Field(type = FieldType.Keyword)
String brand;
/**
* 价格
*/
@Field(type = FieldType.Double)
Double price;
/**
* 图片地址
*/
@Field(type = FieldType.Keyword, index = false)
String images;
public Item() {
}
public Item(Long id, String title, String category, String brand, Double price, String images) {
this.id = id;
this.title = title;
this.category = category;
this.brand = brand;
this.price = price;
this.images = images;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getImages() {
return images;
}
public void setImages(String images) {
this.images = images;
}
}
现在我们就可以在test类中新增CRUD的方法了
1.新增文档
新增一个index方法,这里加一条小米商品信息
@Test
public void index() {
Item item = new Item(1L, "小米手机7", " 手机",
"小米", 3499.00, "http://image.leyou.com/13123.jpg");
itemRepository.save(item);
}
运行这个测试方法,我们可以在kibana上看到新增的文档
我们也可以批量新增
@Test
public void indexList() {
List<Item> list = new ArrayList<>();
list.add(new Item(2L, "坚果手机R1", " 手机", "锤子", 3699.00, "http://image.leyou.com/123.jpg"));
list.add(new Item(3L, "华为META10", " 手机", "华为", 4499.00, "http://image.leyou.com/3.jpg"));
// 接收对象集合,实现批量新增
itemRepository.saveAll(list);
}
再次查看
2.修改文档
修改和新增一样使用的是save方法,需要说明的是,如果你使用save方法传入的新增id已经存在,那么repository会执行覆盖操作,新还旧达到修改的效果,如果新增的id不存在,那就会新增一条文档
3.基本查询
我们首先要给item这个pojo类增加tostring方法
然后添加测试方法
@Test
public void testFind(){
// 查询全部,并按照价格降序排序
Iterable<Item> items = this.itemRepository.findAll(Sort.by(Sort.Direction.DESC, "price"));
items.forEach(item-> System.out.println(item));
}
可以看到查询出了所有手机信息,并且已经按照价格进行了排序
4.自定义查询
我们可以在接口中自定义一个方法,并在测试类中进行传参,即可执行成功,这可太强大了
先增加一个方法
package cn.itcast.elasticsearch;
import cn.itcast.elasticsearch.pojo.Item;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
/**
* 根据价格区间查询
* @param price1
* @param price2
* @return
*/
List<Item> findByPriceBetween(double price1, double price2);
}
在测试类中传参
@Test
public void queryByPriceBetween(){
List<Item> list = this.itemRepository.findByPriceBetween(3499.00, 3699.00);
for (Item item : list) {
System.out.println("item = " + item);
}
}
查看结果