Springboot整合ElasticSearch第三章高级查询

1.基本查询

先看看基本玩法

@Test
public void testQuery(){
    // 词条查询
    MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "小米");
    // 执行查询
    Iterable<Item> items = this.itemRepository.search(queryBuilder);
    //这里是Storm流的写法,jdk8的新特性
    items.forEach(System.out::println);
}

Repository的search方法需要QueryBuilder参数,elasticSearch为我们提供了一个对象QueryBuilders:

Springboot整合ElasticSearch第三章高级查询_第1张图片

QueryBuilders提供了大量的静态方法,用于生成各种不同类型的查询对象,例如:词条、模糊、通配符等QueryBuilder对象。

结果:

在这里插入图片描述
elasticsearch提供很多可用的查询方式,但是不够灵活。如果想玩过滤或者聚合查询等就很难了。

2.自定义查询

先来看最基本的match query(匹配查询):

@Test
public void testNativeQuery(){
    // 构建查询条件
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    // 添加基本的分词查询
    queryBuilder.withQuery(QueryBuilders.matchQuery("title", "小米"));
    // 执行搜索,获取结果
    Page<Item> items = this.itemRepository.search(queryBuilder.build());
    // 打印总条数
    System.out.println(items.getTotalElements());
    // 打印总页数
    System.out.println(items.getTotalPages());
    items.forEach(System.out::println);
}

NativeSearchQueryBuilder:Spring提供的一个查询条件构建器,帮助构建json格式的请求体

Page:默认是分页查询,因此返回的是一个分页的结果对象,包含属性:

  • totalElements:总条数
  • totalPages:总页数
  • Iterator:迭代器,本身实现了Iterator接口,因此可直接迭代得到当前页的数据
  • 其它属性:

Springboot整合ElasticSearch第三章高级查询_第2张图片
结果:

Springboot整合ElasticSearch第三章高级查询_第3张图片

3.分页查询

利用NativeSearchQueryBuilder可以方便的实现分页:

@Test
public void testNativeQuery(){
    // 构建查询条件
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    // 添加基本的分词查询
    queryBuilder.withQuery(QueryBuilders.termQuery("category", "手机"));

    // 初始化分页参数
    int page = 0;
    int size = 3;
    // 设置分页参数
    queryBuilder.withPageable(PageRequest.of(page, size));

    // 执行搜索,获取结果
    Page<Item> items = this.itemRepository.search(queryBuilder.build());
    // 打印总条数
    System.out.println(items.getTotalElements());
    // 打印总页数
    System.out.println(items.getTotalPages());
    // 每页大小
    System.out.println(items.getSize());
    // 当前页
    System.out.println(items.getNumber());
    items.forEach(System.out::println);
}

结果:

Springboot整合ElasticSearch第三章高级查询_第4张图片
可以发现,Elasticsearch中的分页是从第0页开始

4.排序

排序也通用通过NativeSearchQueryBuilder完成:

@Test
public void testSort(){
    // 构建查询条件
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    // 添加基本的分词查询
    queryBuilder.withQuery(QueryBuilders.termQuery("category", "手机"));

    // 排序
    queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));

    // 执行搜索,获取结果
    Page<Item> items = this.itemRepository.search(queryBuilder.build());
    // 打印总条数
    System.out.println(items.getTotalElements());
    items.forEach(System.out::println);
}

结果:

Springboot整合ElasticSearch第三章高级查询_第5张图片

5.匹配多个字段

就是将查询条件放在多个字段上。

@Test
public void mutil_match(){
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    //构建查询条件 
    queryBuilder.withQuery(QueryBuilders.multiMatchQuery("联通", "title","sell_point"));
    //分页
    queryBuilder.withPageable(PageRequest.of(0, 5));
    //查询
    Page<Items> items = itemsRepositoryl.search(queryBuilder.build());
    items.forEach(items1 -> System.out.println("items = " + items1));
}

6.范围查询

比如查询范围内的价格

@Test
public void rangeQuery(){
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    //查询
    queryBuilder.withQuery(QueryBuilders.matchQuery("title", "联通"));
    // lte <=  gte >=   不加e就没有等于  lt > 
    queryBuilder.withQuery(QueryBuilders.rangeQuery("price").lte(139900));
    //分页条件
    queryBuilder.withPageable(PageRequest.of(0, 5));
    Page<Items> search = itemsRepositoryl.search(queryBuilder.build());
    search.forEach(items -> System.out.println("items = " + items));
}

以上就是第三章,高级查询的内容, 请大家支持一下兄弟, 点个赞,不要白嫖了。。。

你可能感兴趣的:(elasticsearch,java)