1.原生查询
1.1.查询
@Autowired
ItemRepository itemRepository;
@Test
public void testquery(){
//查询构建器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//添加查询条件
queryBuilder.withQuery(QueryBuilders.matchQuery("title","小米手机"));
//结果过滤
queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{"id","title","price"},null));
//排序
queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
//分页
queryBuilder.withPageable(PageRequest.of(0,2));
Page<Item> result = itemRepository.search(queryBuilder.build());
long totalElements = result.getTotalElements();
System.out.println("totalElements = " + totalElements);
int totalPages = result.getTotalPages();
System.out.println("totalPages = " + totalPages);
List<Item> list = result.getContent();
for(Item item:list){
System.out.println("item = " + item);
}
}
查询结果:
totalElements = 4
totalPages = 2
item = Item(id=3, title=华为手机MATE10, category=null, brand=null, price=4499.0, images=null)
item = Item(id=4, title=小米手机Min2S, category=null, brand=null, price=4299.0, images=null)
查询构建器时Spring Data提供的,通过构建器添加查询和过滤条件,这些查询和过滤条件时elasticsearch提供的,然后使用Spring Data 提供的itemRepository进行搜索,其返回值是一个分页结果,上面查询的结果和kibana查询结果相同
GET /heima3/_search
{
"query": {
"match": {
"title": "小米手机"
}
},
"_source": ["id","title","price"],
"sort": [
{
"price": {
"order": "desc"
}
}
],
"from": 0,
"size": 2
}
kibana中的from是指数据起始位置,而程序中分页时用的page,指的是起始页
1.2.聚合查询,根据品牌聚合
@Autowired
ElasticsearchTemplate template;
@Test
public void testAgg(){
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
String aggName = "popularBrand";
//聚合
queryBuilder.addAggregation(AggregationBuilders.terms(aggName).field("brand"));
//查询并保存聚合结果
AggregatedPage<Item> result = template.queryForPage(queryBuilder.build(), Item.class);
//解析聚合
Aggregations aggs = result.getAggregations();
//获取指定名称的聚合
StringTerms items = aggs.get(aggName);
//获取桶
List<StringTerms.Bucket> buckets = items.getBuckets();
for (StringTerms.Bucket bucket : buckets) {
System.out.println("bucket.getKey() = " + bucket.getKey());
System.out.println("bucket.getDocCount() = " + bucket.getDocCount());
}
}
查询结果:
bucket.getKey() = 华为
bucket.getDocCount() = 2
bucket.getKey() = 小米
bucket.getDocCount() = 2
bucket.getKey() = 锤子
bucket.getDocCount() = 1
等价的kibana查询
GET /heima3/_search
{
"size": 0,
"aggs": {
"popular_brand": {
"terms": {
"field": "brand"
}
}
}
}
查询结果:
{
"took": 20,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 5,
"max_score": 0,
"hits": []
},
"aggregations": {
"popular_brand": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "华为",
"doc_count": 2
},
{
"key": "小米",
"doc_count": 2
},
{
"key": "锤子",
"doc_count": 1
}
]
}
}
}