elasticsearch

下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch \

聚合【重要】

Elasticsearch中的聚合,包含多种类型,最常用的两种,一个叫,一个叫度量

度量(metrics)

分组完成以后,我们一般会对组中的数据进行聚合运算,例如求平均值、最大、最小、求和等,这些在ES中称为度量

比较常用的一些度量聚合方式:

  • Avg Aggregation:求平均值

  • Max Aggregation:求最大值

  • Min Aggregation:求最小值

  • Percentiles Aggregation:求百分比

  • Stats Aggregation:同时返回avg、max、min、sum、count等

  • Sum Aggregation:求和

  • Top hits Aggregation:求前几

  • Value Count Aggregation:求总数

pom依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

建立索引库

@SpringBootTest
@RunWith(SpringRunner.class)
public class ESAppTest {
​
​
    @Autowired
    private ElasticsearchRestTemplate template;
​
​
    //创建索引
    @Test
    public void testIndex (){
        //创建索引
        template.createIndex(ESUser.class);
        //mapping设置(设置域的类型)
        template.putMapping(ESUser.class);
​
    }
}

9.3.2:保存文档

  //保存文档
    @Test
    public void testSave (){
​
        ESUser doc = new ESUser();
        doc.setId(1);
        doc.setAddress("武汉纺织大学");
        ESUser save = template.save(doc);
    }

9.3.3:刪除文档

//删除文档
    @Test
    public void testDelete (){
        template.delete("1",ESUser.class);
    }

9.3.4:查询(match_all)

    @Test
    public void  test3(){
​
        MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
​
​
        NativeSearchQuery build = new NativeSearchQueryBuilder()
            //指定查询方式
            .withQuery(matchAllQueryBuilder)
​
            .build();
​
​
        SearchHits<ESUser> search = template.search(build, ESUser.class);
​
        //获取总记录数
        long totalHits = search.getTotalHits();
        System.out.println(totalHits);
​
​
        //获取文档列表
        List<SearchHit<ESUser>> searchHits = search.getSearchHits();
​
        List<ESUser> list =
        searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
​
        list.forEach(System.out::println);
    }

9.3.5:查询(match)    

@Test
    public void  test4(){
​
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "我喜欢湖北");
​
​
        NativeSearchQuery build = new NativeSearchQueryBuilder()
            //指定查询方式
            .withQuery(matchQueryBuilder)
​
            .build();
​
​
        SearchHits<ESUser> search = template.search(build, ESUser.class);
​
        //获取总记录数
        long totalHits = search.getTotalHits();
        System.out.println(totalHits);
​
​
        //获取文档列表
        List<SearchHit<ESUser>> searchHits = search.getSearchHits();
​
        List<ESUser> list =
            searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
​
        list.forEach(System.out::println);
​
    }
 

9.3.6:查询(term)  

 @Test
    public void  test5(){
​
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("address", "湖北");
​
        NativeSearchQuery build = new NativeSearchQueryBuilder()
            //指定查询方式
            .withQuery(termQueryBuilder)
​
            .build();
​
​
        SearchHits<ESUser> search = template.search(build, ESUser.class);
​
        //获取总记录数
        long totalHits = search.getTotalHits();
        System.out.println(totalHits);
​
​
        //获取文档列表
        List<SearchHit<ESUser>> searchHits = search.getSearchHits();
​
        List<ESUser> list =
            searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
​
        list.forEach(System.out::println);
​
​
​
    }
 

9.3.7:查询(range)

   @Test
    public void  test6(){
​
​
        RangeQueryBuilder age = QueryBuilders.rangeQuery("age").lte(36).gte(30);
​
​
        NativeSearchQuery build = new NativeSearchQueryBuilder()
            //指定查询方式
            .withQuery(age)
​
            .build();
​
​
        SearchHits<ESUser> search = template.search(build, ESUser.class);
​
        //获取总记录数
        long totalHits = search.getTotalHits();
        System.out.println(totalHits);
​
​
        //获取文档列表
        List<SearchHit<ESUser>> searchHits = search.getSearchHits();
​
        List<ESUser> list =
            searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
​
        list.forEach(System.out::println);
​
​
​
    }

9.3.8:查询(page)

 @Test
    public void  test7(){
​
​
        RangeQueryBuilder age = QueryBuilders.rangeQuery("age").lte(36).gte(0);
​
​
        PageRequest pageRequest = PageRequest.of(0, 2);
​
​
        NativeSearchQuery build = new NativeSearchQueryBuilder()
            //指定查询方式
            .withQuery(age)
​
            //设置分页信息
            .withPageable(pageRequest)
​
            .build();
​
​
        SearchHits<ESUser> search = template.search(build, ESUser.class);
​
        //获取总记录数
        long totalHits = search.getTotalHits();
        System.out.println(totalHits);
​
​
        //获取文档列表
        List<SearchHit<ESUser>> searchHits = search.getSearchHits();
​
        List<ESUser> list =
            searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
​
        list.forEach(System.out::println);
​
​
​
    }

9.3.9:查询(bool)

​
    /**
     * address 我喜欢湖北  match
     * should
     * 30>age>10    range
     */
@Test
    public void  test8(){
​
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
​
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "我喜欢湖北");
        RangeQueryBuilder age = QueryBuilders.rangeQuery("age").gte(10).lte(30);
​
        boolQueryBuilder.should(matchQueryBuilder).should(age);
​
​
        NativeSearchQuery build = new NativeSearchQueryBuilder()
            //指定查询方式
            .withQuery(boolQueryBuilder)
​
            .build();
​
​
        SearchHits<ESUser> search = template.search(build, ESUser.class);
​
        //获取总记录数
        long totalHits = search.getTotalHits();
        System.out.println(totalHits);
​
​
        //获取文档列表
        List<SearchHit<ESUser>> searchHits = search.getSearchHits();
​
        List<ESUser> list =
            searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
​
        list.forEach(System.out::println);
​
​
​
    }

9.3.10:查询(high light)

//单域highlight
    @Test
    public void  test9(){
​
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "我喜欢湖北");
​
​
        NativeSearchQuery build = new NativeSearchQueryBuilder()
            //指定查询方式
            .withQuery(matchQueryBuilder)
            //设置高亮
            .withHighlightBuilder(getHighlightBuilder("address"))
            .build();
​
​
        SearchHits<ESUser> search = template.search(build, ESUser.class);
​
        //获取总记录数
        long totalHits = search.getTotalHits();
        System.out.println(totalHits);
​
​
        //获取文档列表
        List<SearchHit<ESUser>> searchHits = search.getSearchHits();
​
        List<ESUser> list =
//            searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
​
            searchHits.stream().map(hit->{
​
                ESUser esUser = hit.getContent();
                //取高亮
                Map<String, List<String>> highlightFields = hit.getHighlightFields();
​
                highlightFields.forEach((k,v)->{
                    String highlightVal = v.get(0);
                    if("address".equals(k)){
                        esUser.setAddress(highlightVal);
                    }
                });
​
​
                return  esUser;
​
            }).collect(Collectors.toList());
​
​
​
        list.forEach(System.out::println);
​
​
​
    }
​
    //多域highlight
   
 @Test
    public void  test10(){
​
        MatchQueryBuilder addressmatchQueryBuilder = QueryBuilders.matchQuery("address", "我喜欢湖北");
        MatchQueryBuilder jobmatchQueryBuilder = QueryBuilders.matchQuery("job", "工程师");
​
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.should(addressmatchQueryBuilder).should(jobmatchQueryBuilder);
​
        NativeSearchQuery build = new NativeSearchQueryBuilder()
            //指定查询方式
            .withQuery(boolQueryBuilder)
            //设置高亮
            .withHighlightBuilder(getHighlightBuilder("address","job"))
            .build();
​
​
        SearchHits<ESUser> search = template.search(build, ESUser.class);
​
        //获取总记录数
        long totalHits = search.getTotalHits();
        System.out.println(totalHits);
​
​
        //获取文档列表
        List<SearchHit<ESUser>> searchHits = search.getSearchHits();
​
        List<ESUser> list =
//            searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
​
            searchHits.stream().map(hit->{
​
                ESUser esUser = hit.getContent();
                //取高亮
                Map<String, List<String>> highlightFields = hit.getHighlightFields();
​
                highlightFields.forEach((k,v)->{
                    String highlightVal = v.get(0);
                    if("address".equals(k)){
                        esUser.setAddress(highlightVal);
                    }
                    if("job".equals(k)){
                        esUser.setJob(highlightVal);
                    }
                });
​
​
                return  esUser;
​
            }).collect(Collectors.toList());
​
​
​
        list.forEach(System.out::println);
​
​
​
    }
​
    // 设置高亮字段
 private HighlightBuilder getHighlightBuilder(String... fields) {
        // 高亮条件
        HighlightBuilder highlightBuilder = new HighlightBuilder(); //生成高亮查询器
        for (String field : fields) {
            highlightBuilder.field(field);//高亮查询字段
        }
        highlightBuilder.requireFieldMatch(false);     //如果要多个字段高亮,这项要为false
        highlightBuilder.preTags("<span style=\"color:red\">");   //高亮设置
        highlightBuilder.postTags("</span>");
        //下面这两项,如果你要高亮如文字内容等有很多字的字段,必须配置,不然会导致高亮不全,文章内容缺失等
        highlightBuilder.fragmentSize(800000); //最大高亮分片数
        highlightBuilder.numOfFragments(0); //从第一个分片获取高亮片段
​
        return highlightBuilder;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值