ElasticSearch使用ElasticsearchRepository做多属性进行查询,ElasticsearchTemplate

官方示例

在这里插入图片描述

解释一下:你想要使用多属性进行作为查询条件时,你只在接口中自定义方法即可,但是你的方法名应按照以上格式findByXXXAndXXXAndXXX,无需写实现,ElasticsearchRepository即会自动生成查询的json格式

示例

public interface BookRepository extends ElasticsearchRepository<Book,String> {
    //自定义查询方法 根据name ,content
    List<Book> findByNameAndContent(String nameKeyWord,String contentKeyWord);
}


    @Test
    public void findByNameAndContent(){
        //直接调用接口中的方法即可
        List<Book> list = bookRepository.findByNameAndContent("张三", "发现");
        list.forEach(book -> System.out.println(book));
    }

其他方法亦是如此

复杂查询 分页

 @Test
    public void testSearch(){
        MatchAllQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
        SearchQuery searchQuery = new NativeSearchQuery(queryBuilder)
                .setPageable(PageRequest.of(0,1));
        Page<Book> books = bookRepository.search(searchQuery);
        books.forEach(book -> System.out.println(book));
    }

使用ElasticsearchTemplate做复杂查询

分页,排序

 @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;//spring容器已存在此bean实例,直接注入即可
    /**
     * 使用ElasticsearchTemplate做复杂查询
     * 分页,排序
     */
    @Test
    public void testElasticsearchTemplate(){
        SearchQuery searchQuery  = new NativeSearchQueryBuilder()//查询数据,构造出一个查询
                .withIndices("dangdang")//设置要查询的索引,参数为可变参数,可写多个索引("dangdang","kaungkang",...)
                .withTypes("book")//查询的文档类型,也是桐同样,可变参数,在多个类型中查询("book","",...)
                .withQuery(QueryBuilders.matchAllQuery())//设置一个查询条件,,此处为查询所有
                .withSort(new FieldSortBuilder("price").order(SortOrder.DESC))//设置排序条件,此处根据属性排序,根据价格的降序
                .withPageable(PageRequest.of(0,5))//设置分页参数
                .build();//构造一个SearchQuery

        AggregatedPage<Book> books = elasticsearchTemplate.queryForPage(searchQuery, Book.class);//传入查询,和要查询的类型
        books.forEach(book -> System.out.println(book));
    }

多字段,分词检索,过滤,分页,排序,高亮

/**
     * 多字段,分词检索,过滤,分页,排序,高亮
     */
    @Test
    public void testMangSearchN(){
        HighlightBuilder.Field filed = new HighlightBuilder.Field("*");//设置需要高亮的属性,也可使用通配符*
        filed.preTags("<span style='color:red;'>");//样式前缀
        filed.postTags("</span");//样式后缀

        SearchQuery searchQuery =new NativeSearchQueryBuilder()
                .withIndices("dangdang")//索引
                .withTypes("book")//类型
                //.withFields("name","content")//可以设置只查询那些属性
                .withQuery(QueryBuilders.queryStringQuery("张三").field("name").field("content"))//查询内容,基于name,content
                .withFilter(QueryBuilders.rangeQuery("price").gte("50"))//设置过滤条件,价格大于等于50的
                .withPageable(PageRequest.of(0,5))//分页
                .withSort(new FieldSortBuilder("price").order(SortOrder.DESC))//根据价格降序排列
                .withHighlightFields(filed)//设置高亮,可变参数,可传入多个高亮的属性
                .build();

        AggregatedPage<Book> books = elasticsearchTemplate.queryForPage(searchQuery, Book.class, new SearchResultMapper() {//对查询进行自定义封装
            @Override
            public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
                List<Book> books = new ArrayList<>();
                //根据相应结果货期His
                SearchHits hits = searchResponse.getHits();
                //索取his数组
                SearchHit[] searchHits = hits.getHits();
                //遍历结果数据
                for (SearchHit searchHit : searchHits) {
                    Book book = new Book();
                    //获取原始数据
                    Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
                    //获取高亮处理后的数据
                    Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();

                    book.setId(searchHit.getId());
                    book.setAuther(sourceAsMap.get("auther").toString());
                    if(highlightFields.containsKey("auther")){//是否有高亮处理,有就将原始数据覆盖掉
                        book.setAuther(highlightFields.get("auther").getFragments()[0].toString());
                    }
                    book.setContent(sourceAsMap.get("content").toString());
                    if(highlightFields.containsKey("content")){//是否有高亮处理,有就将原始数据覆盖掉
                        book.setContent(highlightFields.get("content").getFragments()[0].toString());
                    }
                    book.setName(sourceAsMap.get("name").toString());
                    if(highlightFields.containsKey("name")){//是否有高亮处理,有就将原始数据覆盖掉
                        book.setName(highlightFields.get("name").getFragments()[0].toString());
                    }
                    book.setPrice(Double.parseDouble(sourceAsMap.get("price").toString()));
                    if(highlightFields.containsKey("price")){//是否有高亮处理,有就将原始数据覆盖掉
                        book.setPrice(Double.parseDouble(highlightFields.get("price").getFragments()[0].toString()));
                    }
                    book.setPubdata(new Date(Long.parseLong(sourceAsMap.get("pubdata").toString())));
                    if(highlightFields.containsKey("pubdata")){//是否有高亮处理,有就将原始数据覆盖掉
                        book.setPubdata(new Date(Long.parseLong(highlightFields.get("pubdata").getFragments()[0].toString())));
                    }
                    books.add(book);
                }

                return new AggregatedPageImpl<>((List<T>)books);
            }

            @Override
            public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {
                return null;
            }
        });
        books.forEach(book -> System.out.println(book));
    }
执行结果
Book(id=1001, name=<span style='color:red;'>张三</span历险记-被更新了, price=99.89, pubdata=Sat Dec 12 00:06:26 CST 2020, content=<span style='color:red;'>张三</span醒来发现自己在一个荒无人烟的小岛上,他四处望了望。。。, auther=李四呀)
Book(id=1002, name=法外狂徒, price=66.66, pubdata=Sat Dec 12 15:03:29 CST 2020, content=是人性的扭曲,还是道德的沦丧,<span style='color:red;'>张三</span始终逍遥法外。。。, auther=王五呀)
  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Spring Boot中使用Elasticsearch进行分页查询,可以通过继承ElasticsearchRepository接口来实现。首先,确保已经引入了spring-boot-starter-data-elasticsearch依赖,并配置好相关的Elasticsearch连接信息。 接下来,创建一个继承自ElasticsearchRepository的接口,并指定实体类和主键类型。在该接口中,可以使用Spring Data Elasticsearch提供的方法进行分页查询,其中包括searchSimilar方法。 下面是一个示例代码: ```java import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.annotations.Query; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface UserRepository extends ElasticsearchRepository<User, String> { @Query("{\"bool\" : {\"must\" : {\"term\" : {\"name\" : \"?0\"}}}}") Page<User> searchSimilar(String name, Pageable pageable); } ``` 在上述示例中,User是实体类,String是主键类型。searchSimilar方法使用了自定义的查询语句,并通过Pageable参数实现了分页查询使用该接口进行分页查询的示例代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserRepository userRepository; public Page<User> searchSimilarUsers(String name, int page, int size) { Pageable pageable = PageRequest.of(page, size); return userRepository.searchSimilar(name, pageable); } } ``` 在上述示例中,UserService类使用了UserRepository接口进行分页查询,通过调用searchSimilar方法实现了根据name字段进行相似查询,并指定了页码和每页大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值