原生查询

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
        }
      ]
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值