ES-RestHighLevelClient查询文档

RestHighLevelClient操作查询文档

查询操作基本步骤

//注入依赖
@Autowired
private RestHighLevelClient restHighLevelClient;
//1.创建查询索引对象
SearchRequest request = new SearchRequest("索引库名");
//2.创建构生成器对象
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders qbs);
//可以直接写成 => request.source().query(QueryBuilders qbs); //不创建对象
//3.传入生成器
request.source(sourceBuilder);
//4.发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//5.解析响应数据
handleResponse(response);

批量同步

  //数据库同步索引库-批量操作
    @Test
    void testBulkNewRequest() throws IOException {
        //分页打包添加  批量导入文档
        int page = 1;
        int size = 100;
        Page<Hotel> hotelPage = hotelService.page(new Page<>(page, size));

        for (long i = 1; i <= hotelPage.getPages(); i++) {
            Page<Hotel> hotelData = hotelService.page(new Page<>(i, size));
            BulkRequest bulkRequest = new BulkRequest();
            for (Hotel hotel : hotelData.getRecords()) {
                HotelDoc hotelDoc = new HotelDoc(hotel);
                String hotelString = JSONObject.toJSONString(hotelDoc);
                bulkRequest.add(new IndexRequest("hotel")
                        .id(hotelDoc.getId().toString())
                        .source(hotelString, XContentType.JSON));
            }
            client.bulk(bulkRequest, RequestOptions.DEFAULT);
        }
    }

文档的增删改查操作

class HotelDocumentTest {

    @Autowired
    private RestHighLevelClient client;

    @Autowired
    private IHotelService hotelService;

    /**
     * 文档的增删改查操作
     *
     * @throws IOException io
     */
    @Test
    void testAddDoc() throws IOException {
        //1.查询数据库hotel数据
        Hotel hotel = hotelService.getById(61083);
        //2.转换为HotelDoc
        HotelDoc hotelDoc = new HotelDoc(hotel);
        //3.转换成json
        String jsonString = JSONObject.toJSONString(hotelDoc);
        //4.准备request
        IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
        //5.这是发送的文档
        request.source(jsonString, XContentType.JSON);
        client.index(request, RequestOptions.DEFAULT);
    }

    @Test
    void testGetDoc() throws IOException {
        //1.准备Request
        GetRequest request = new GetRequest("hotel").id("61083");
        //2.发送请求
        GetResponse response = client.get(request, RequestOptions.DEFAULT);
        //3.解析响应
        String source = response.getSourceAsString();
        //json转换成对象
        HotelDoc hotelDoc = JSON.parseObject(source, HotelDoc.class);

        System.out.println(hotelDoc);
    }

    @Test
    void testDeleteDoc() throws IOException {
        DeleteRequest request = new DeleteRequest("hotel", "s1bhYYsBHGmKNOlBr0L6");
        client.delete(request, RequestOptions.DEFAULT);
    }

    @Test
    void testUpdateDoc() throws IOException {
        UpdateRequest request = new UpdateRequest("hotel", "61083");
        request.doc(
                "price", "999"
        );
        client.update(request, RequestOptions.DEFAULT);
    }

完全匹配查询

    @Test
    void testMatchAll() throws IOException {
        SearchRequest request = new SearchRequest("hotel");
        //查询所有数据
        /*
        GET /_search
        {
            "query": {
                "match_all": {}
            }
        }
         */
        request.source().query(QueryBuilders.matchAllQuery());
        //查询单字段
        /*
        GET /index_name/_search
        {
         "query": {
             "match": {
                 "name": "如家"
                 }
             }
         }
         */
        request.source().query(QueryBuilders.matchQuery("name", "如家"));
        //查询多个字段
        /*
        GET /hotel/_search
        {
            "query": {
                "multi_match": {
                    "query": "如家",
                    "fields": ["name","brand"]
                }
            }
        }
        */
        request.source().query(QueryBuilders.multiMatchQuery("如家", "name", "brand"));
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析响应
        handleResponse(response);
    }

精确查询

    @Test
    void testExactQuery() throws IOException {
        SearchRequest request = new SearchRequest("hotel");

        //查询所有数据 准备DSL
        //精确查询
        /*
        GET /hotel/_search
        {
            "query": {
            "term": {
                "city": {
                    "value": "北京"
                }
            }
        }
        }
        */
        request.source().query(QueryBuilders.termQuery("city", "北京"));
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析响应
        handleResponse(response);
    }

布尔查询

    @Test
    void testBooleanQueries() throws IOException {
        SearchRequest request = new SearchRequest("hotel");
        //查询所有数据
        //布尔查询
          /*
            GET /hotel/_search
            {
              "query": {
                "bool": {
                  "must": [
                    {
                      "multi_match": {
                        "query": "如家",
                        "fields": [
                          "name"
                        ]
                      }
                    }
                  ],
                  "must_not": [
                    {
                      "range": {
                        "price": {
                          "gte": 0,
                          "lte": 400
                        }
                      }
                    }
                  ],
                  "filter": [
                    {
                      "geo_distance": {
                        "distance": "10km",
                        "location": "39.909187,116.397455"
                      }
                    }
                  ]
                }
              }
            }
          */
        request.source().query(QueryBuilders.boolQuery()
                .must(QueryBuilders.multiMatchQuery("如家", "name"))
                .mustNot(QueryBuilders.rangeQuery("price").gte(0).lte(400))
                .filter(QueryBuilders.geoDistanceQuery("location").distance("10km").point(39.909187, 116.397455)));
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析响应
        handleResponse(response);
    }

分页排序

    @Test
    void testPage() throws IOException {
        SearchRequest request = new SearchRequest("hotel");
        //查询所有数据 准备DSL
        //分页 排序
        /*
        GET /hotel/_search
        {
          "query": {
            "match_all": {}
          },
          "from": 0,
          "size": 5,
          "sort": [
            {
              "price": {
                "order": "desc"
              }
            }
          ]
        }
         */
        request.source()
                .query(QueryBuilders.matchAllQuery())
                .from(1)
                .size(10)
                .sort("price", SortOrder.DESC);
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析响应
        handleResponse(response);
    }

关键字高亮处理

        @Test
    void testHighlight() throws IOException {
        SearchRequest request = new SearchRequest("hotel");
        //查询所有数据 准备DSL
        //高亮
        /*
        #如果要对非搜索字段高亮,则需要添加一个属性:required_field_match=false
        GET /hotel/_search
        {
          "query": {
            "match": {
              "all": "如家"
            }
          },
          "highlight": {
            "fields": {
              "name": {
                "require_field_match": "false"  
              }
            }
          }
        }
        #// 查询条件,高亮一定要使用全文检索查询
        GET /hotel/_search
        {
          "query": {
            "match": {
              "brand": "如家"
            }
          },
          "highlight": {
            "fields": {
              "brand": {
                "pre_tags": "<em>",
                "post_tags": "</em>"
              }
            }
          }
        }
         */
        request.source()
                .query(QueryBuilders.matchQuery("brand", "如家"))
                .highlighter(new HighlightBuilder()
                        .field("brand")
                        .preTags("<em>")
                        .postTags("</em>"));
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析响应
        handleResponseTag(response);
    }

响应数据统一处理


    /**
     * 处理响应数据方法
     *
     * @param response 响应数据
     */

    private void handleResponse(SearchResponse response) {
        long value = response.getHits().getTotalHits().value;
        System.out.println("总共" + value + "条记录");
        for (SearchHit hit : response.getHits().getHits()) {
            String source = hit.getSourceAsString();
            //字符串反序列化成对象
            HotelDoc hotelDoc = JSON.parseObject(source, HotelDoc.class);
            System.out.println(hotelDoc);
        }
    }

    /**
     * 处理高亮显示数据响应
     *
     * @param response 响应数据
     */
    private void handleResponseTag(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("brand");
                if (highlightField != null) {
                    // 获取高亮值
                    String brand = highlightField.getFragments()[0].string();
                    // 覆盖非高亮结果
                    hotelDoc.setBrand(brand);
                }
            }
            System.out.println(hotelDoc);
        }
    }
}
打赏
评论区
头像
文章目录

本网站由提供CDN加速/云存储服务