RestClient查询文档

RestClient查询文档

match_all

GET /hotel/_search
{
  "query": {
    "match_all": {
      
    }
}

通过match_all来演示下面基本的API

@Test
void testMatchAll() throws IOException {
    //1准备Request
    SearchRequest request=new SearchRequest("hotel");
    //2,准备DSL
    request.source().query(QueryBuilders.matchAllQuery());
    //3、发送请求
    SearchResponse search = client.search(request, RequestOptions.DEFAULT);

    System.out.println(search);
}

source()包含了查询、排序、分页、高亮等

QueryBuilders是一个工具类,有各种查询

解析结果:

        //解析结果
        SearchHits hits = search.getHits();

        //获取总条数
        long totalHits = hits.getTotalHits().value;
        System.err.println("共搜索到"+totalHits+"条数据");

        //文档数组
        SearchHit[] hitsList = hits.getHits();
         //遍历
        for (SearchHit documentFields : hitsList) {
            String sourceAsString = documentFields.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(sourceAsString, HotelDoc.class);
            System.out.println(hotelDoc);
        }
    

match和mutiMatchQuery

request.source().query(QueryBuilders.matchQuery("all","如家"));

可以使用ctrl+alt+m将公共的部分抽取出来

作为一个函数

private static void extracted(SearchResponse search) {
    //解析结果
    SearchHits hits = search.getHits();

    //获取总条数
    long totalHits = hits.getTotalHits().value;
    System.err.println("共搜索到"+totalHits+"条数据");

    //文档数组
    SearchHit[] hitsList = hits.getHits();
    //遍历
    for (SearchHit documentFields : hitsList) {
        String sourceAsString = documentFields.getSourceAsString();
        HotelDoc hotelDoc = JSON.parseObject(sourceAsString, HotelDoc.class);
        System.out.println(hotelDoc);
    }
}

复合查询

查询城市是"上海",价格低于250

GET /hotel/_search
{
  "query": {
    "term": {
      "city": {
        "value": "上海"
      }
    }
  }
}

GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 100,
        "lte": 200
      }
    }
  }
}
@Test
void testBool() throws IOException {
    SearchRequest request=new SearchRequest("hotel");

    BoolQueryBuilder booleanQuery=QueryBuilders.boolQuery();
    booleanQuery.must(QueryBuilders.termQuery("city","上海"));
    booleanQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
   //准备dsl
    request.source().query(booleanQuery);

    SearchResponse  search = client.search(request, RequestOptions.DEFAULT);
    extracted(search);

}

排序和分页

搜索结果的排序和分页是与query同级的参数

    @Test
    void testPageAndSort() throws IOException {
        //前端传过来的当前页和每页大小
        int currentPage=1;
        int size=5;
        SearchRequest request=new SearchRequest("hotel");

        //准备dsl
        request.source().query(QueryBuilders.matchAllQuery());

        //排序
        request.source().sort("price", SortOrder.ASC);
        //分页
        request.source().from((currentPage-1)*size).size(size);


        SearchResponse search = client.search(request, RequestOptions.DEFAULT);
        extracted(search);

    }

高亮

GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家"
    }
  },
  "highlight": {
    "fields": {
      "name": {
        "require_field_match": "false"
      }
    }
  }
}
    @Test
    void testHightLight() throws IOException {

        SearchRequest request=new SearchRequest("hotel");

        //准备dsl
        request.source().query(QueryBuilders.matchQuery("all","如家"));
        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));



        SearchResponse search = client.search(request, RequestOptions.DEFAULT);
        extracted(search);
    }

处理结果(较之前不同)

private static void extracted(SearchResponse search) {
    //解析结果
    SearchHits hits = search.getHits();

    //获取总条数
    long totalHits = hits.getTotalHits().value;
    System.err.println("共搜索到"+totalHits+"条数据");

    //文档数组
    SearchHit[] hitsList = hits.getHits();
    //遍历
    for (SearchHit documentFields : hitsList) {
        String sourceAsString = documentFields.getSourceAsString();
        HotelDoc hotelDoc = JSON.parseObject(sourceAsString, HotelDoc.class);

        //添加健壮性判断

        //获取高亮结果
        Map<String, HighlightField> highlightFields = documentFields.getHighlightFields();
       if (highlightFields!=null||highlightFields.size()!=0){


        //根据名字获取高亮结果
        HighlightField name = highlightFields.get("name");

        //再做一次判断
           if (name!=null) {

               //获取高亮值
               String s = name.getFragments()[0].toString();

               //覆盖非高亮结果
               hotelDoc.setName(s);
           }
       }
        System.out.println(hotelDoc);
    }



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值