[Elasticsearch] 聚合中的重要概念 - Buckets(桶)及Metrics(指标)

一:文档对象如下

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "items", type = "item",shards = 5, replicas = 1)
public class Item implements Serializable {

    @Id
    private Long id;

    /**标题*/
    @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
    private String title;

    /**分类*/
    @Field(type = FieldType.Keyword)
    private String category;

    /**品牌*/
    @Field(type = FieldType.Text,  analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
    private String brand;

    /**价格*/
    @Field(type = FieldType.Double)
    private Double price;

    /**图片地址*/
    @Field(index = false, type = FieldType.Keyword)
    private String images;

}

二:非聚合复杂查询(这儿展示了非聚合复杂查询的常用流程)

    public void listPage(){
        //1.创建QueryBuilder(即设置查询条件)这儿创建的是组合查询(也叫多条件查询),后面会介绍更多的查询方法
        /*组合查询BoolQueryBuilder
         * must(QueryBuilders)   :AND
         * mustNot(QueryBuilders):NOT
         * should:               :OR
         */
        BoolQueryBuilder builder = QueryBuilders.boolQuery();
        //builder下有must、should以及mustNot 相当于sql中的and、or以及not

        //设置模糊搜索,博客的简诉中有学习两个字
        builder.must(QueryBuilders.fuzzyQuery("category", "一级"));

        //设置要查询博客的标题中含有关键字
//        builder.must(new QueryStringQueryBuilder("title").field("阿迪达斯裤子"));

        //按照博客的评论数的排序是依次降低
        FieldSortBuilder sort = SortBuilders.fieldSort("price").order(SortOrder.DESC);

        //设置分页(从第一页开始,一页显示10条)
        //注意开始是从0开始,有点类似sql中的方法limit 的查询
        PageRequest page = new PageRequest(0, 10);

        //2.构建查询
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        //将搜索条件设置到构建中
        nativeSearchQueryBuilder.withQuery(builder);
        //将分页设置到构建中
        nativeSearchQueryBuilder.withPageable(page);
        //将排序设置到构建中
        nativeSearchQueryBuilder.withSort(sort);
        //生产NativeSearchQuery
        NativeSearchQuery query = nativeSearchQueryBuilder.build();

        //3.执行方法1
        Page<Item> itemPage = itemRespository.search(query);
        //执行方法2:注意,这儿执行的时候还有个方法那就是使用elasticsearchTemplate
        //执行方法2的时候需要加上注解
        //@Autowired
        //private ElasticsearchTemplate elasticsearchTemplate;
        List<Item> blogList = elasticsearchTemplate.queryForList(query, Item.class);

        //4.获取总条数(用于前端分页)
        int total = (int) itemPage.getTotalElements();

        //5.获取查询到的数据内容(返回给前端)
        List<Item> content = itemPage.getContent();

        System.out.println(total);
        System.out.println(content);
    }

三:精确查询(必须完全匹配上)

单个匹配termQuery

//不分词查询 参数1: 字段名,参数2:字段查询值,因为不分词,所以汉字只能查询一个字,英语是一个单词.
QueryBuilder queryBuilder=QueryBuilders.termQuery("fieldName", "fieldlValue");
//分词查询,采用默认的分词器
QueryBuilder queryBuilder2 = QueryBuilders.matchQuery("fieldName", "fieldlValue");

 

上一篇:Hive 的分桶表是什么?有什么作用?


下一篇:Golang源码阅读笔记 - Map