spring cloud中ES的組合查詢做課程查詢
阿新 • • 發佈:2020-09-15
課程的Controller
@RequestMapping(value="/queryCourses",method= RequestMethod.POST) public AjaxResult queryCourses(@RequestBody CourseQuery courseQuery){ try { return courseService.queryCourses(courseQuery); } catch (Exception e) { e.printStackTrace();View Codereturn AjaxResult.me().setMessage("儲存物件失敗!"+e.getMessage()); } }
service的這裡有一個問題就是
@RequestBody這個標籤只能傳入簡單的資料傳輸簡單的欄位不能夠傳輸ES封裝的欄位,所以我們需要把查詢條件傳入ES的Controller中封裝查詢條件
/** * 查詢課程】 * 從ES中找到課程 * 這裡我們不能夠在這裡封裝查詢物件 * Java傳輸的是否只能夠傳輸簡單的物件所以我們需要在ES中封裝資料 * @param courseQuery * @returnView Code*/ @Override public AjaxResult queryCourses(CourseQuery courseQuery) { return esCourseClient.search(courseQuery); }
這裡沒什麼寫的主要在ES微服務中
ES的Controller
/** * 從ES中查詢資料儲存顯示到前端 * queryCourses * @return */ @PostMapping("/es/search") public AjaxResult search(@RequestBody CourseQuery courseQuery){View Codetry { PageList<ESCourseDoc> pageList= esCourseService.search(courseQuery); System.out.println(pageList+"controller"); return AjaxResult.me().setResultObj(pageList); } catch (Exception e) { e.printStackTrace(); return AjaxResult.me().setSuccess(false).setResultObj("查詢失敗"); } }
ES的service看註釋即可
/** * 從ES中找到資料 * 1.獲取條件 * 2.封裝資料 * 3.儲存資料 * 4.獲得查詢物件 * @param courseQuery * @return */ @Override public PageList<ESCourseDoc> search(CourseQuery courseQuery) { NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder(); //2.把courseQuery中的查詢設定給Builder BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); //查詢關鍵字 System.out.println(courseQuery.getKeyword()); if(StringUtils.isNotEmpty(courseQuery.getKeyword())){ boolQueryBuilder.must(QueryBuilders.matchQuery("searchField",courseQuery.getKeyword())); } //判斷課程型別,精確匹配 if(null != courseQuery.getProductType()){ boolQueryBuilder.filter(QueryBuilders.termQuery("courseTypeId",courseQuery.getProductType())); } //判斷範圍需要分開判斷 if(null != courseQuery.getPriceMin()){ boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(courseQuery.getPriceMin())); } if(null != courseQuery.getPriceMax()){ boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(courseQuery.getPriceMax())); } builder.withQuery(boolQueryBuilder); //3.把courseQuery中的分頁 builder.withPageable(PageRequest.of(courseQuery.getPage() - 1 , courseQuery.getRows())); //4.把courseQuery中的排序設定給Builder if(StringUtils.isNotEmpty(courseQuery.getSortField())){ //排序編號 String sortFieldSN = courseQuery.getSortField(); //排序的欄位 String sortField = null; //排序編號變成排序欄位 switch (sortFieldSN){ case "xl": sortField = "saleCount"; break; case "xp": sortField = "onLineTime"; break; case "pl": sortField = "commentCount"; break; case "jg": sortField = "price"; break; case "rq": sortField = "viewCount"; break; } //排序方式 SortOrder sortOrder = SortOrder.DESC; if(StringUtils.isNotEmpty(courseQuery.getSortType()) && courseQuery.getSortType().toLowerCase().equals("asc")){ sortOrder = SortOrder.ASC; } builder.withSort(new FieldSortBuilder(sortField).order(sortOrder)); } //5.執行查詢得到結果DOC物件 Page<ESCourseDoc> page = courseElasticsearchRepository.search(builder.build()); System.out.println(page+"service"); //6.把總天數和每天的內容封裝進去 return new PageList<>(page.getTotalElements(),page.getContent()); }View Code
然後通過fegin介面呼叫即可