1. 程式人生 > 實用技巧 >spring cloud中ES的組合查詢做課程查詢

spring cloud中ES的組合查詢做課程查詢

課程的Controller

@RequestMapping(value="/queryCourses",method= RequestMethod.POST)
    public AjaxResult queryCourses(@RequestBody CourseQuery courseQuery){
        try {
            return courseService.queryCourses(courseQuery);
        } catch (Exception e) {
            e.printStackTrace();
            
return AjaxResult.me().setMessage("儲存物件失敗!"+e.getMessage()); } }
View Code

service的這裡有一個問題就是

@RequestBody這個標籤只能傳入簡單的資料傳輸簡單的欄位不能夠傳輸ES封裝的欄位,所以我們需要把查詢條件傳入ES的Controller中封裝查詢條件
/**
     * 查詢課程】
     * 從ES中找到課程
     * 這裡我們不能夠在這裡封裝查詢物件
     * Java傳輸的是否只能夠傳輸簡單的物件所以我們需要在ES中封裝資料
     * @param courseQuery
     * @return
     
*/ @Override public AjaxResult queryCourses(CourseQuery courseQuery) { return esCourseClient.search(courseQuery); }
View Code

這裡沒什麼寫的主要在ES微服務中

ES的Controller

 /**
     * 從ES中查詢資料儲存顯示到前端
     * queryCourses
     * @return
     */
    @PostMapping("/es/search")
    public AjaxResult search(@RequestBody CourseQuery courseQuery){
        
try { 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("查詢失敗"); } }
View Code

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介面呼叫即可