Spring Data Elasticsearch篇(3):ElasticsearchRepository文档操作

1、ElasticsearchRepository

1.1、ElasticsearchRepository源码

@NoRepositoryBean
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {

	<S extends T> S index(S entity);

	Iterable<T> search(QueryBuilder query);
     //search方法需要QueryBuilder参数和springdata的Pageable分页参数
   //其中QueryBuilder是一个接口,常用的实现类有MatchQueryBuilder、RangeQueryBuilder范围、FuzzyQueryBuilder模糊、WildcardQueryBuilder模糊。
	Page<T> search(QueryBuilder query, Pageable pageable);
    //SearchQuery是一个查询接口,NativeSearchQuery是该接口的一个实现
	Page<T> search(SearchQuery searchQuery);

	Page<T> searchSimilar(T entity, String[] fields, Pageable pageable);

	void refresh();

	Class<T> getEntityClass();
}

【注意】       

(1)ElasticsearchRepository里面search(QueryBuilder query)方法,其中QueryBuilder是一个接口,常用的实现类有MatchQueryBuilder、RangeQueryBuilder范围、FuzzyQueryBuilder模糊、WildcardQueryBuilder模糊。

(2)ElasticsearchRepository里面search(SearchQuery searchQuery)方法,主要是看QueryBuilder和SearchQuery两个参数;其中SearchQuery是一个接口,有一个实现类叫NativeSearchQuery

1.2、自定义方法

       自定义方法的前提是我们需要继承ElasticsearchRepository接口,利用强大的Spring Data来实现。比如:你的方法名叫做:findByTitle,那么它就知道你是根据title查询,然后自动帮你完成,无需写实现类。

【自定义方法命名约定】:

KeywordSampleElasticsearch Query String
AndfindByNameAndPrice{"bool" : {"must" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}
OrfindByNameOrPrice{"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}
IsfindByName{"bool" : {"must" : {"field" : {"name" : "?"}}}}
NotfindByNameNot{"bool" : {"must_not" : {"field" : {"name" : "?"}}}}
BetweenfindByPriceBetween{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
LessThanEqualfindByPriceLessThan{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
GreaterThanEqualfindByPriceGreaterThan{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}
BeforefindByPriceBefore{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
AfterfindByPriceAfter{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}
LikefindByNameLike{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}
StartingWithfindByNameStartingWith{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}
EndingWithfindByNameEndingWith{"bool" : {"must" : {"field" : {"name" : {"query" : "*?","analyze_wildcard" : true}}}}}
Contains/ContainingfindByNameContaining{"bool" : {"must" : {"field" : {"name" : {"query" : "**?**","analyze_wildcard" : true}}}}}
InfindByNameIn(Collection<String>names){"bool" : {"must" : {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"name" : "?"}} ]}}}}
NotInfindByNameNotIn(Collection<String>names){"bool" : {"must_not" : {"bool" : {"should" : {"field" : {"name" : "?"}}}}}}
NearfindByStoreNearNot Supported Yet !
TruefindByAvailableTrue{"bool" : {"must" : {"field" : {"available" : true}}}}
FalsefindByAvailableFalse{"bool" : {"must" : {"field" : {"available" : false}}}}
OrderByfindByAvailableTrueOrderByNameDesc{"sort" : [{ "name" : {"order" : "desc"} }],"bool" : {"must" : {"field" : {"available" : true}}}}

例如,我们来按照价格区间查询,定义这样的一个方法findByPriceBetween

/**
 * 需要继承ElasticsearchRepository接口
 * 由于Item实体类中id为Long类型
 */
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
    /**
     * 方法名必须遵守SpringData的规范
     * 价格区间查询     
     */
    List<Item> findByPriceBetween(double price1, double price2);
}

2、基本操作

在【https://mp.csdn.net/postedit/84323886】基础上我们进行以下操作,实体类和索引创建都是安装上述博客内容;下面只对Repository操作详细说明。

2.1、定义自己的Repository接口

/**
 * 需要继承ElasticsearchRepository接口
 * 由于Item实体类中id为Long类型
 */
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
    /**
     * 方法名必须遵守SpringData的规范
     * 价格区间查询
     */
    List<Item> findByPriceBetween(double price1, double price2);
}

2.2、新增单条文档

添加单条文档数据使用的save()方法。

  @Autowired
    private ItemRepository itemRepository;
    @Test
    public void insert(){
        Item item = new Item(1L, "小米手机7", " 手机","小米", 3499.00, "http://image.leyou.com/13123.jpg");
        itemRepository.save(item);
    }

2.3、插入多条文档

插入多条文档数据使用的saveAll()方法。

    @Autowired
    private ItemRepository itemRepository;
    @Test
    public void indexList() {
        List<Item> list = new ArrayList<>();
        list.add(new Item(1L, "小米手机7", "手机", "小米", 3299.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(2L, "坚果手机R1", "手机", "锤子", 3699.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(3L, "华为META10", "手机", "华为", 4499.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(4L, "小米Mix2S", "手机", "小米", 4299.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(5L, "荣耀V10", "手机", "华为", 2799.00, "http://image.leyou.com/13123.jpg"));
        // 接收对象集合,实现批量新增
        itemRepository.saveAll(list);
    }

2.4、修改文档

修改文档数据也是使用的save()方法。

 @Autowired
 private ItemRepository itemRepository;
  @Test
   public void update(){
        //Optional是java8新添加的类
        Optional<Item> itemOptional= itemRepository.findById(1L);
        Item item = itemOptional.get();
        item.setTitle("修改后的小米8");
        itemRepository.save(item);
    }

2.5、基本简单查询

 

 【代码例子】

    /**
     * 查询全部,并安装价格降序排序
     */
    @Test
    public void testFind(){
        // Sort是包下的org.springframework.data类,Sort.Direction是个枚举类
        Iterable<Item> items = this.itemRepository.findAll(Sort.by(Sort.Direction.DESC, "price"));
        items.forEach(item-> System.err.println(item));
    }

 2.6、自定义方法查询

我们在DAO层的ItemRepository接口中自定义按照价格区间查询方法:

public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
    /**
     * 方法名必须遵守SpringData的规范
     * 价格区间查询
     */
    List<Item> findByPriceBetween(double price1, double price2);
}

【代码】

    @Autowired
    private ItemRepository itemRepository;
   /**
     * 自定义方法findByPriceBetween查询范围
     */
    @Test
    public void queryByPriceBetween(){
        List<Item> items = itemRepository.findByPriceBetween(3500, 4500);
        items.stream().forEach(item -> {
            System.err.println("item:"+item);
        });
    }

 

  • 7
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值