基于springdata通过respository操作elasticsearch

目录

SpringData操作elasticsearch的思路

定义Repository接口

使用Repository操作Elasticsearch

1.新增文档

2.修改文档

3.基本查询

4.自定义查询 


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);
        }
    }

查看结果

发布了343 篇原创文章 · 获赞 162 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/Delicious_Life/article/details/104291522