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:
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<item>
:默认是分页查询,因此返回的是一个分页的结果对象,包含属性:
- totalElements:总条数
- totalPages:总页数
- Iterator:迭代器,本身实现了Iterator接口,因此可直接迭代得到当前页的数据
- 其它属性:
结果:
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);
}
结果:
可以发现,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);
}
结果:
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));
}
以上就是第三章,高级查询的内容, 请大家支持一下兄弟, 点个赞,不要白嫖了。。。