Elastic search入门到集群实战操作详解(原生API操作、spring( 六 )


无需写实现,SDE会自动帮我们实现该方法,我们只需要用即可:
@Testpublic void querySelfIndexData() {List byPriceBetween = productRepository.findByPriceBetween(1000d, 4000d);System.out.println(byPriceBetween);}
支持的一些语法示例:
3.5.原生查询
如果觉得上述接口依然不符合你的需求,SDE也支持原生查询,这个时候还是使用 e
而查询条件的构建是通过一个名为 lder 的类来完成的,不过这个类的底层还 是使用的原生API中的、、等工具 。
需求: 查询title中包含小米手机的商品,以价格升序排序,分页查询:每页展示2条,查询第1页 。对查询结果进行聚合分析:获取品牌及个数
示例
/*** 查询title中包含小米手机的商品,以价格升序排序,分页查询:每页展示2条,查询第1页 。* 对查询结果进行聚合分析:获取品牌及个数*/@Testpublic void nativeQuery() {//1.构建一个原生查询器NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();//2.source过来//2.1参数: public FetchSourceFilter(String[] includes, String[] excludes)queryBuilder.withSourceFilter(new FetchSourceFilter(new String[0], new String[0]));//3.查询条件queryBuilder.withQuery(QueryBuilders.matchQuery("title","小米手机"));//4.设置分页,并排序queryBuilder.withPageable(PageRequest.of(0,10, Sort.by(Sort.Direction.ASC,"price")));//高亮//HighlightBuilder.Field field = new HighlightBuilder.Field("title");HighlightBuilder builder = new HighlightBuilder();builder.field("title");builder.preTags("");builder.postTags("");//设置为0即可返回完整内容 而非片段builder.numOfFragments(0);queryBuilder.withHighlightBuilder(builder);//5.对查询结果进行聚合分析:获取品牌及个数queryBuilder.addAggregation(AggregationBuilders.terms("brandAgg").field("brand").missing("title"));//6.查询AggregatedPage result = template.queryForPage(queryBuilder.build(), Product.class,new ESSearchResultMapper());System.out.println(result);//7.获取结果//总数long total = result.getTotalElements();//页码int totalPage = result.getTotalPages();//获取本业的数据集合List content = result.getContent();content.stream().forEach(System.out::print);//获取聚合的结果Aggregations aggregations = result.getAggregations();Terms terms = aggregations.get("brandAgg");//获取桶并且遍历桶中的内容terms.getBuckets().forEach(b->{System.out.println("品牌->"+b.getKey());System.out.println("文档数->"+b.getDocCount());});}
注:上述查询不支持高亮结果 。
高亮展示:
1、自定义搜索结果映射
/*** @Author panghl* @Date 2021/9/5 1:09* @Description 自定义结果映射,处理高亮**/public class ESSearchResultMapper implements SearchResultMapper {/*** 完成结果映射* 操作的重点应该是将原有的结果: _source 取出来,放入高亮的数据** @param searchResponse* @param aClass* @param pageable* @param * @return AggregatedPage 需要三个参数进行构建:pageable,List,总记录数*/@Overridepublic AggregatedPage mapResults(SearchResponse searchResponse, Class aClass, Pageable pageable) {//获取总记录数SearchHits hits = searchResponse.getHits();long totalHits = hits.getTotalHits();System.out.println("总记录数->" + totalHits);Gson gson = new Gson();//记录列表List productList = new ArrayList<>();for (SearchHit hit : hits) {if (hits.getHits().length <= 0) {return null;}//获取_source属性中的所有数据Map map = hit.getSourceAsMap();//获取高亮的字段Map highlightFields = hit.getHighlightFields();//每个高亮字段都需要进行设置for (Map.Entry highlightField : highlightFields.entrySet()) {//获取高亮的key : 高亮的字段String key = highlightField.getKey();//获得value : 高亮之后的效果HighlightField value = http://www.kingceram.com/post/highlightField.getValue();//将高亮字段和文本效果放入map中map.put(key, value.getFragments()[0].toString());}//将map转为对象T T = gson.fromJson(gson.toJson(map), aClass);productList.add(T);}//第四个参数response.getAggregations()添加聚合结果return new AggregatedPageImpl