RestClient查询文档--快速入门

ElasticsearchRESTAPI中的查询构造与实例
本文详细介绍了ElasticsearchRestAPI中如何构建查询条件,包括MATCH_ALL、全文检索查询(match和multi_match)、精确查询(term和range),以及排序、分页和高亮功能的使用示例。

目录

1.MATCH_ALL

2.全文检索查询

2.1match查询

matchQuery,单字段查询

multiMatchQuery,多字段查询

3.精确查询

3.1term查询

3.2range查询

4.排序和分页

4.1排序

5.高亮

RestAPI中其中构建查询条件的核心部分是由一-个名为QueryBuilders的工具类提供的,其中包含了各种查询方法:

可以看到方法非常得多,挑一些常用的举例说明。

1.MATCH_ALL

API使用和结果展示:

可以看到获取到的内容与我们在浏览器的dev-tool里使用match_all方法是一样的

这个hits里面保存的就是我们要获取的主要内容,封装好的响应类里面提供了getHits方法帮助我们获取数据

查看结果:

2.全文检索查询

2.1match查询

全文检索的match和multi_ match查询与match_ all的API基本一 致。 差别是查询条件,也就是query的部分。

同样是使用QueryBuilders提供的方法:

matchQuery,单字段查询

举例:request.source().query(QueryBuilders.matchQuery("all","皇冠假日"));

 结果:

效果同:

GET /hotel/_search
{
  "query": {
    "match": {
      "all": "皇冠假日"
    }
  }
}

完整代码如下:

 @Test
    public void matchSomething () throws IOException {
        // 1.准备request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
            // 2.1 单字段查询  matchQuery(字段,搜索内容)
        request.source().query(QueryBuilders.matchQuery("all","皇冠假日"));
        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        SearchHits hits = search.getHits();

        hits.forEach( v -> {
            String sourceAsString = v.getSourceAsString();
            Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
            System.out.println(hotel);
        });
    }

multiMatchQuery,多字段查询

举例:

request.source().query(QueryBuilders.multiMatchQuery("万豪","brand","business"));

结果:

 

效果同:

GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "万豪",
      "fields": ["name","business"]
    }
  }
}

 完整代码如下:
 

    @Test
    public void matchSomething () throws IOException {
        // 1.准备request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
            // 2.2 多字段查询 multiMatchQuery(搜索内容,字段1,[字段2,字段3,......])
        request.source().query(QueryBuilders.multiMatchQuery("万豪","brand","business"));
        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        SearchHits hits = search.getHits();

        hits.forEach( v -> {
            String sourceAsString = v.getSourceAsString();
            Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
            System.out.println(hotel);
        });

    }

3.精确查询

3.1term查询

举例:QueryBuilders.termQuery("city","北京");

结果:

效果同:

GET /hotel/_search
{
  "query": {
    "term": {
      "city": {
        "value": "北京"
      }
    }
  }
}

完整代码如下: 

    @Test
    public void matchTerm () throws IOException {
        // 1.准备request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.termQuery("city","北京"));
        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        SearchHits hits = search.getHits();

        hits.forEach( v -> {
            String sourceAsString = v.getSourceAsString();
            Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
            System.out.println(hotel);
        });
    }

3.2range查询

举例:QueryBuilders.rangeQuery("price").gte(100).lte(600);

 结果:

 效果同:

GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 700,
        "lte": 1000
      }
    }
  }
}

完整代码如下:  

@Test
    public void matchRange () throws IOException {
        // 1.准备request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(600));
        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        SearchHits hits = search.getHits();

        hits.forEach( v -> {
            String sourceAsString = v.getSourceAsString();
            Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
            System.out.println(hotel);
        });
    }

4.排序和分页

4.1排序

举例:requset.source.sort("price",SortOrder.ASC);

 完整代码:

@Test
    public void matchSort () throws IOException {
        // 1.准备request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().sort("price", SortOrder.ASC);
        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        SearchHits hits = search.getHits();

        hits.forEach( v -> {
            String sourceAsString = v.getSourceAsString();
            Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
            System.out.println(hotel);
        });
    }

 结果:

效果同:

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ]
}

4.2 分页

举例:request.source().from(0).size(5);

 完整代码:

@Test
    public void matchPage () throws IOException {
        // 1.准备request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().from(0).size(5);
        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        SearchHits hits = search.getHits();

        hits.forEach( v -> {
            String sourceAsString = v.getSourceAsString();
            Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
            System.out.println(hotel);
        });
    }

 结果:

效果同:

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0,
  "size": 5
}

5.高亮

高亮API包括请求DSL构建和结果解析两部分。我们先看请求的DSL:

request.source().

        highlighter(new HighlightBuilder()

                .field("name")

                //  是否需要与查询字段匹配

                .requireFieldMatch(false)

);

 测试代码:

 @Test
    public void matchHighLight () throws IOException {
        // 1.准备request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.matchQuery("all","皇冠假日"));
        // 3. 高亮
        request.source().highlighter(new HighlightBuilder()
                .field("name")
                .requireFieldMatch(false)
        );
        // 4.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        SearchHits hits = search.getHits();

        hits.forEach( v -> {
            String sourceAsString = v.getSourceAsString();
            Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
            System.out.println(hotel);
        });
    }

效果:

可以看到我们匹配的字符串都被打上了<em></em>默认高亮标签

但是呢,其实高亮内容的处理比较复杂,看看这里是如何获取的,代码如下:

@Test
    public void matchHighLight () throws IOException {
        // 1.准备request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.matchQuery("all","皇冠假日"));
        // 3. 高亮
        request.source().highlighter(new HighlightBuilder()
                .field("name")
                .requireFieldMatch(false)
        );
        // 4.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 获取主要内容 文档存放对象
        SearchHits hits = search.getHits();
        // 获取文档数组
        SearchHit[] hits1 = hits.getHits();
        // 遍历
        for(SearchHit s : hits1) {
            // 获取文档source
            String sourceAsString = s.getSourceAsString();
            // 反序列化
            Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
            // 获取高亮结果
            Map<String, HighlightField> highlightFields = s.getHighlightFields();
            // 根据字段名获取高亮结果
            HighlightField name = highlightFields.get("name");
            // 获取高亮值
            String string = name.getFragments()[0].string();
            // 覆盖非高亮结果
            hotel.setName(string);
            System.out.println("最终结果:" + string);
        }
    }

输出:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值