1 package com.example.demo;
  2 
  3 import com.alibaba.fastjson.JSON;
  4 import org.elasticsearch.action.get.MultiGetRequest;
  5 import org.elasticsearch.client.Client;
  6 import org.elasticsearch.client.RestHighLevelClient;
  7 import org.elasticsearch.index.query.MatchQueryBuilder;
  8 import org.elasticsearch.index.query.QueryBuilders;
  9 import org.elasticsearch.search.aggregations.AggregationBuilders;
 10 import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
 11 import org.elasticsearch.search.aggregations.metrics.avg.InternalAvg;
 12 import org.elasticsearch.search.sort.SortBuilders;
 13 import org.elasticsearch.search.sort.SortOrder;
 14 import org.junit.jupiter.api.Test;
 15 import org.springframework.beans.factory.annotation.Autowired;
 16 import org.springframework.boot.test.context.SpringBootTest;
 17 import org.springframework.data.domain.Page;
 18 import org.springframework.data.domain.PageRequest;
 19 import org.springframework.data.domain.Sort;
 20 import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
 21 import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
 22 import org.springframework.data.elasticsearch.core.query.FetchSourceFilter;
 23 import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
 24 
 25 import java.util.ArrayList;
 26 import java.util.List;
 27 
 28 @SpringBootTest
 29 class DemoApplicationTests {
 30     @Autowired
 31     GoodsRepository goodsRepository;
 32     @Test
 33     void contextLoads() {
 34     }
 35 //    @Autowired
 36 //    private ElasticsearchTemplate elasticsearchTemplate;
 37 
 38 
 39 
 40 
 41     @Test
 42     public void addDocument() {
 43         Goods goods = new Goods(1L, "大米1S", "手机",
 44                 "大米", 3499.00, "https://img13.360buyimg.com/n1/s450x450_jfs/t1/79993/29/9874/153231/5d7809f4E8f387bff/1dc9e1b6b262f0fb.jpg");
 45         Goods goods0 = goodsRepository.save(goods);
 46         System.out.println(JSON.toJSONString(goods0));
 47     }
 48 
 49     /**
 50      * 批量新增
 51      */
 52     @Test
 53     public void createDocumentList() {
 54         List<Goods> list = new ArrayList<>();
 55         list.add(new Goods(2L, "坚果手机R1", " 手机", "锤子", 3699.00, "http://image.leyou.com/123.jpg"));
 56         list.add(new Goods(3L, "华为META10", " 手机", "华为", 4499.00, "http://image.leyou.com/3.jpg"));
 57         // 接收对象集合,实现批量新增
 58         goodsRepository.saveAll(list);
 59     }
 60 
 61     @Test
 62     public void findDocument() {
 63         // 查询全部,并安装价格降序排序
 64         Iterable<Goods> goodsIterable = this.goodsRepository.findAll(Sort.by(Sort.Direction.DESC, "price"));
 65         goodsIterable.forEach(goods -> System.out.println(JSON.toJSONString(goods)));
 66     }
 67 
 68     @Test
 69     public void indexList() {
 70         List<Goods> list = new ArrayList<>();
 71         list.add(new Goods(1L, "小米手机7", "手机", "小米", 3299.00, "http://image.leyou.com/13123.jpg"));
 72         list.add(new Goods(2L, "坚果手机R1", "手机", "锤子", 3699.00, "http://image.leyou.com/13123.jpg"));
 73         list.add(new Goods(3L, "华为META10", "手机", "华为", 4499.00, "http://image.leyou.com/13123.jpg"));
 74         list.add(new Goods(4L, "小米Mix2S", "手机", "小米", 4299.00, "http://image.leyou.com/13123.jpg"));
 75         list.add(new Goods(5L, "荣耀V10", "手机", "华为", 2799.00, "http://image.leyou.com/13123.jpg"));
 76         // 接收对象集合,实现批量新增
 77         goodsRepository.saveAll(list);
 78     }
 79 
 80     @Test
 81     public void queryByPriceBetween(){
 82         List<Goods> list = this.goodsRepository.findByPriceBetween(2000.00, 3500.00);
 83         for (Goods goods: list) {
 84             System.out.println(goods);
 85         }
 86     }
 87     @Test
 88     public void testQuery(){
 89         MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("id", "1");
 90         Iterable<Goods> items =goodsRepository.search(queryBuilder);
 91         for (Goods item : items) {
 92             System.out.println(JSON.toJSONString(item));
 93         }
 94     }
 95 
 96     @Test
 97     void findByTitle()
 98     {
 99         Goods goods= goodsRepository.findByTitle("小米Mix2S");
100         System.out.println(JSON.toJSONString(goods));
101     }
102 
103 
104     @Test
105     public void testNativeQuery(){
106         // 构建查询条件
107         NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
108         // 添加基本的分词查询
109         queryBuilder.withQuery(QueryBuilders.termQuery("category", "手机"));
110 
111         // 初始化分页参数
112         int page = 0;
113         int size = 20;
114         // 设置分页参数
115         queryBuilder.withPageable(PageRequest.of(page, size));
116 
117         // 执行搜索,获取结果
118         Page<Goods> items = goodsRepository.search(queryBuilder.build());
119         // 打印总条数
120         System.out.println(items.getTotalElements());
121         // 打印总页数
122         System.out.println(items.getTotalPages());
123         // 每页大小
124         System.out.println(items.getSize());
125         // 当前页
126         System.out.println(items.getNumber());
127         for (Goods item : items) {
128             System.out.println(JSON.toJSONString(item));
129         }
130     }
131     @Test
132     public void testSort(){
133         // 构建查询条件
134         NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
135         // 添加基本的分词查询
136         queryBuilder.withQuery(QueryBuilders.termQuery("category", "手机"));
137 
138         // 排序
139         queryBuilder.withSort(SortBuilders.fieldSort("id").order(SortOrder.ASC));
140 
141         // 执行搜索,获取结果
142         Page<Goods> items = goodsRepository.search(queryBuilder.build());
143         // 打印总条数
144         System.out.println(items.getTotalElements());
145         for (Goods item : items) {
146             System.out.println(JSON.toJSONString(item));
147         }
148     }
149     @Test
150     /**
151      * 按照品牌brand进行分组 统计各品牌的总数
152      * */
153     public void testAgg(){
154         NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
155         // 不查询任何结果
156         queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));
157         // 1、添加一个新的聚合,聚合类型为terms,聚合名称为brands,聚合字段为brand
158         queryBuilder.addAggregation(
159                 AggregationBuilders.terms("brands").field("brand"));
160         // 2、查询,需要把结果强转为AggregatedPage类型
161         AggregatedPage<Goods> aggPage = (AggregatedPage<Goods>) goodsRepository.search(queryBuilder.build());
162         // 3、解析
163         // 3.1、从结果中取出名为brands的那个聚合,
164         // 因为是利用String类型字段来进行的term聚合,所以结果要强转为StringTerm类型
165         StringTerms agg = (StringTerms) aggPage.getAggregation("brands");
166         // 3.2、获取桶
167         List<StringTerms.Bucket> buckets = agg.getBuckets();
168         // 3.3、遍历
169         for (StringTerms.Bucket bucket : buckets) {
170             // 3.4、获取桶中的key,即品牌名称
171             System.out.println(bucket.getKeyAsString());
172             // 3.5、获取桶中的文档数量
173             System.out.println(bucket.getDocCount());
174         }
175     }
176     @Test
177     /**
178      * 嵌套聚合,求平均值
179      * */
180     public void testSubAgg(){
181         NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
182         // 不查询任何结果
183         queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));
184         // 1、添加一个新的聚合,聚合类型为terms,聚合名称为brands,聚合字段为brand
185         queryBuilder.addAggregation(
186                 AggregationBuilders.terms("brands").field("brand")
187                         .subAggregation(AggregationBuilders.avg("priceAvg").field("price")) // 在品牌聚合桶内进行嵌套聚合,求平均值
188         );
189         // 2、查询,需要把结果强转为AggregatedPage类型
190         AggregatedPage<Goods> aggPage = (AggregatedPage<Goods>) goodsRepository.search(queryBuilder.build());
191         // 3、解析
192         // 3.1、从结果中取出名为brands的那个聚合,
193         // 因为是利用String类型字段来进行的term聚合,所以结果要强转为StringTerm类型
194         StringTerms agg = (StringTerms) aggPage.getAggregation("brands");
195         // 3.2、获取桶
196         List<StringTerms.Bucket> buckets = agg.getBuckets();
197         // 3.3、遍历
198         for (StringTerms.Bucket bucket : buckets) {
199             // 3.4、获取桶中的key,即品牌名称  3.5、获取桶中的文档数量
200             System.out.println(bucket.getKeyAsString() + ",共" + bucket.getDocCount() + "台");
201 
202             // 3.6.获取子聚合结果:
203             InternalAvg avg = (InternalAvg) bucket.getAggregations().asMap().get("priceAvg");
204             System.out.println("平均售价:" + avg.getValue());
205         }
206     }
207 
208 }