SpringBoot实现elasticsearch 查询操作(RestHighLevelClient 的案例实战)

 更新时间:2023年07月02日 09:14:11   作者:我有一颗五叶草  
这篇文章主要给大家介绍了SpringBoot如何实现elasticsearch 查询操作,文中有详细的代码示例和操作流程,具有一定的参考价值,需要的朋友可以参考下

上一节讲述了 SpringBoot 实现 elasticsearch 索引操作,这一章节讲述SpringBoot实现elasticsearch查询操作。

0. 环境准备

案例用到的索引库结构

PUT /hotel
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "name":{
        "type": "text",
        "analyzer": "ik_max_word",
        "copy_to": "all"
      },
      "address":{
        "type": "keyword",
        "index": false
      },
      "price":{
        "type": "integer"
      },
      "score":{
        "type": "integer"
      },
      "brand":{
        "type": "keyword",
        "copy_to": "all"
      },
      "city":{
        "type": "keyword",
        "copy_to": "all"
      },
      "starName":{
        "type": "keyword"
      },
      "business":{
        "type": "keyword"
      },
      "location":{
        "type": "geo_point"
      },
      "pic":{
        "type": "keyword",
        "index": false
      },
      "all":{
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

1. 查询全部

@GetMapping("/searchAll")
public List<HotelDoc> searchAll() throws Exception {
    //1.创建请求语义对象
    SearchRequest searchRequest = new SearchRequest("索引名称");
    // QueryBuilders: 构建查询类型
    searchRequest.source().query(QueryBuilders.matchAllQuery());
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    return handleResponse(searchResponse);
}

2. 根据 name 查询 match 分词查询

 @GetMapping("/searchByName/{name}")
public List<HotelDoc> searchByName(@PathVariable("name") String name) 
	throws Exception {
    //1.创建请求语义对象
    SearchRequest searchRequest = new SearchRequest("索引名称");
    // QueryBuilders: 构建查询类型
    searchRequest.source().query(QueryBuilders.matchQuery("name", name));
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    return handleResponse(searchResponse);
}

3. 根据 name 和 品牌查询 multiMatch 分词查询

@GetMapping("/searchByNameAndBrand/{name}")
public List<HotelDoc> searchByNameAndBrand(@PathVariable("name") String name) throws Exception {
    //1.创建请求语义对象
    SearchRequest searchRequest = new SearchRequest("索引名称");
    // QueryBuilders: 构建查询类型
    searchRequest.source().query(QueryBuilders.multiMatchQuery(name,"name","brand"));
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    return handleResponse(searchResponse);
}

4. 根据 brand 查询 match 分词查询

@GetMapping("/searchByBrand/{name}")
public List<HotelDoc> searchByBrand(@PathVariable("name") String name) throws Exception {
    //1.创建请求语义对象
    SearchRequest searchRequest = new SearchRequest("索引名称");
    // QueryBuilders: 构建查询类型
    searchRequest.source().query(QueryBuilders.matchQuery("brand", name));
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    return handleResponse(searchResponse);
}

5. 按照价格 范围查询

 @GetMapping("/searchByPrice/{low}/{high}")
public List<HotelDoc> searchByPrice(@PathVariable("low") String low, @PathVariable("high") String high) throws Exception {
    //1.创建请求语义对象
    SearchRequest searchRequest = new SearchRequest("索引名称");
    // QueryBuilders: 构建查询类型
    searchRequest.source().query(QueryBuilders.rangeQuery("price").gte(low).lte(high));
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    return handleResponse(searchResponse);
}

6. 精确查询

@GetMapping("/termQueryCity/{city}")
public List<HotelDoc> termQueryCity(@PathVariable("city") String city) throws Exception {
    //1.创建请求语义对象
    SearchRequest searchRequest = new SearchRequest("索引名称");
    // QueryBuilders: 构建查询类型
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	//searchSourceBuilder.query(QueryBuilders.termQuery("city", city)); 这行有点小问题
	//	https://zhuanlan.zhihu.com/p/270426807 参考
    searchSourceBuilder.query(QueryBuilders.termQuery("city.keyword", city));
    searchRequest.source(searchSourceBuilder);
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    return handleResponse(searchResponse);
}

7. boolQuery

@GetMapping("/testBool")
public List<HotelDoc> testBool() throws Exception {
    // 1.准备Request
    SearchRequest request = new SearchRequest("索引名称");
    // 2.准备DSL
    // 2.1.准备BooleanQuery
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    // 2.2.添加term
    boolQuery.must(QueryBuilders.termQuery("city.keyword", "杭州"));
    // 2.3.添加range
    boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
    request.source().query(boolQuery);
    // 3.发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    // 4.解析响应
    return handleResponse(response);
}

8. 分页

 @GetMapping("/testPageAndSort/{currentPage}/{pageSize}")
public List<HotelDoc> testPageAndSort(@PathVariable("currentPage") Integer currentPage, @PathVariable("pageSize") Integer pageSize) throws Exception {
    // 页码,每页大小
    // 1.准备Request
    SearchRequest request = new SearchRequest("索引名称");
    // 2.准备DSL
    // 2.1.query
    request.source().query(QueryBuilders.matchAllQuery());
    // 2.2.排序 sort
    request.source().sort("price", SortOrder.ASC);
    // 2.3.分页 from、size
    request.source().from((currentPage - 1) * pageSize).size(pageSize);
    // 3.发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    // 4.解析响应
    return handleResponse(response);
}

9. 高亮查询

 @GetMapping("/testHighlight/{name}")
void testHighlight(@PathVariable("name") String name) throws Exception {
    // 1.准备Request
    SearchRequest request = new SearchRequest("索引名称");
    // 2.准备DSL
    // 2.1.query
    request.source().query(QueryBuilders.matchQuery("name", name));
    // 2.2.高亮
    request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
    // 3.发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    // 4.解析响应
    handleResponse2(response);
}

10. 公共解析

private List<HotelDoc> handleResponse(SearchResponse response) throws Exception {
    // 获取命中的所有内容
    SearchHits searchHits = response.getHits();
    // 获取命中的总条数
    long count = searchHits.getTotalHits().value;
    System.out.println("命中的条数为: "+ count);
    // 获取命中的文档对象数组
    SearchHit[] hits = searchHits.getHits();
    List<HotelDoc> docList = new ArrayList<>();
    for (SearchHit hit : hits) {
        // 解析每一个hit对象得到对应的文档数据
        String json = hit.getSourceAsString();
        //  HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
        docList.add(JSON.parseObject(json, HotelDoc.class));
    }
    //destroy();
    return docList;
}
private void handleResponse2(SearchResponse response) {
    // 4.解析响应
    SearchHits searchHits = response.getHits();
    // 4.1.获取总条数
    long total = searchHits.getTotalHits().value;
    System.out.println("共搜索到" + total + "条数据");
    // 4.2.文档数组
    SearchHit[] hits = searchHits.getHits();
    // 4.3.遍历
    for (SearchHit hit : hits) {
        // 获取文档source
        String json = hit.getSourceAsString();
        // 反序列化
        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
        // 获取高亮结果
        Map<String, HighlightField> highlightFields = hit.getHighlightFields();
        if ( !CollectionUtils.isEmpty(highlightFields) ) {
            // 根据字段名获取高亮结果
            HighlightField highlightField = highlightFields.get("name");
            if (highlightField != null) {
                // 获取高亮值
                String name = highlightField.getFragments()[0].string();
                // 覆盖非高亮结果
                hotelDoc.setName(name);
            }
        }
        System.out.println("hotelDoc = " + hotelDoc);
    }
}

到此这篇关于SpringBoot实现elasticsearch 查询操作(RestHighLevelClient 的案例实战)的文章就介绍到这了,更多相关SpringBoot elasticsearch查询操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring boot admin 搭建详解

    spring boot admin 搭建详解

    本篇文章主要介绍了spring boot admin 搭建详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Java中CopyOnWriteArrayList的使用解析

    Java中CopyOnWriteArrayList的使用解析

    这篇文章主要介绍了Java中CopyOnWriteArrayList的使用解析,CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存,它不存在扩容的概念,每次写操作都要复制一个副本,在副本的基础上修改后改变Array引用,需要的朋友可以参考下
    2023-12-12
  • SpringBoot整合Mybatis实现高德地图定位并将数据存入数据库的步骤详解

    SpringBoot整合Mybatis实现高德地图定位并将数据存入数据库的步骤详解

    这篇文章主要介绍了SpringBoot整合Mybatis实现高德地图定位并将数据存入数据库的步骤详解,本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Mybatis实现批量操作8种小结

    Mybatis实现批量操作8种小结

    本文对Mybatis的五种批处理方式进行了性能测试,包括批量新增和批量修改,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • Java利用Dijkstra算法求解拓扑关系最短路径

    Java利用Dijkstra算法求解拓扑关系最短路径

    迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学迪家迪杰斯特拉于1959年提出的,因此又叫狄克斯特拉算法。本文将利用迪克斯特拉(Dijkstra)算法求拓扑关系最短路径,感兴趣的可以了解一下
    2022-07-07
  • java 面试题闰年判断详解及实例

    java 面试题闰年判断详解及实例

    这篇文章主要介绍了java面试题 闰年判断的相关资料,需要的朋友可以参考下
    2017-03-03
  • Spring @Conditional通过条件控制bean注册过程

    Spring @Conditional通过条件控制bean注册过程

    这篇文章主要为大家介绍了Spring @Conditional通过条件控制bean注册过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java中创建ZIP文件的方法

    Java中创建ZIP文件的方法

    本文通过一段简单代码给大家介绍了java中创建zip文件的方法,代码超简单,感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-06-06
  • java使用Stream流对自定义对象数组去重的实现

    java使用Stream流对自定义对象数组去重的实现

    本文主要介绍了java使用Stream流对自定义对象数组去重的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Tk.mybatis零sql语句实现动态sql查询的方法(4种)

    Tk.mybatis零sql语句实现动态sql查询的方法(4种)

    有时候,查询数据需要根据条件使用动态查询,这时候需要使用动态sql,本文主要介绍了Tk.mybatis零sql语句实现动态sql查询的方法,感兴趣的可以了解一下
    2021-12-12

最新评论