SpringBoot实现elasticsearch 查询操作(RestHighLevelClient 的案例实战)
上一节讲述了 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查询操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
使用jekins自动构建部署java maven项目的方法步骤
这篇文章主要介绍了使用jekins自动构建部署java maven项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-01-01SpringBoot整合Javamail实现邮件发送的详细过程
日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等,下面这篇文章主要给大家介绍了关于SpringBoot整合Javamail实现邮件发送的详细过程,需要的朋友可以参考下2022-10-10Spring Boot中整合Spring Security并自定义验证代码实例
本篇文章主要介绍了Spring Boot中整合Spring Security并自定义验证代码实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-04-04springboot使用redisRepository和redistemplate操作redis的过程解析
本文给大家介绍springboot整合redis/分别用redisRepository和redistemplate操作redis,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2022-05-05浅谈spring的重试机制无效@Retryable@EnableRetry
这篇文章主要介绍了浅谈spring的重试机制无效@Retryable@EnableRetry,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-09-09
最新评论