1. 程式人生 > 實用技巧 >elasticsearch7 巢狀查詢,根據巢狀欄位排序--備忘

elasticsearch7 巢狀查詢,根據巢狀欄位排序--備忘

GET wk_bbs_index/_search
{
  "post_filter": {
    "bool": {
      "adjust_pure_negative": true,
      "must": [
        {
          "term": {
            "baseInfo.cityAlias": {
              "boost": 1,
              "value": "sz"
            }
          }
        }
      ],
      "boost": 1
    }
  },
  
"query": { "bool": { "adjust_pure_negative": true, "must": [ { "term": { "isDisable": { "boost": 1, "value": "0" } } }, { "nested": { "path": "bbsSubjectEsVos",
"score_mode": "none", "query": { "term": { "bbsSubjectEsVos.subjectId": { "boost": 1, "value": "3021723" } } }, "boost": 1, "ignore_unmapped": false } } ],
"boost": 1 } }, "sort": [ { "bbsSubjectEsVos.order": { "nested": { "filter": { "term": { "bbsSubjectEsVos.subjectId": { "boost": 1, "value": "3021723" } } }, "path": "bbsSubjectEsVos" }, "order": "desc" } }, { "bbsSalePriceEsVo.price": { "order": "asc" } } ], "_source": [ "pkId", "name", "bbsSalePriceEsVo.price", "bbsSubjectEsVos.subjectId", "bbsSubjectEsVos.order" ] }

需求:巢狀排序,根據主題排序號越大排序越前,然後根據價格排序

    /**
     * 載入查詢條件
     * @param searchVO
     * @return
     */
    public void initQuerySubjectbbsListBuilder(NativeSearchQueryBuilder queryBuilder, SubJectVO searchVO) {
        // 複合查詢
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        {// 資料必須有效
            TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("isDisable", ContantsEnums.DISABLE_0.getIndex());
            boolQueryBuilder.must(termQueryBuilder);
        }
        // 主題相關
//        String fkIdLocationSt;
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("bbsSubjectEsVos.subjectId", searchVO.getSubjectId());
        NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("bbsSubjectEsVos", termQueryBuilder, ScoreMode.None);
        boolQueryBuilder.must(nestedQueryBuilder);
        // 查詢條件
        queryBuilder.withQuery(boolQueryBuilder); // 範圍查詢
    }
    

    /**
     * @desc 設定分頁、排序
     * @date 2020年4月3日 上午10:06:18
     * @param queryBuilder 查詢物件
     * @param searchReq 查詢引數
     */
    public void initQuerySubjectbbsListSort(NativeSearchQueryBuilder queryBuilder, SubJectVO searchVo) {
        // 載入分頁資訊
        Pageable pageable =this.initPageTable(searchVo.getPn(), searchVo.getPs(), 0, 15);
        queryBuilder.withPageable(pageable);
        // 根據序號倒序 
        NestedSortBuilder nestedSort = new NestedSortBuilder("bbsSubjectEsVos");
        // 巢狀查詢排序,是在上面查詢的結果中抽取資料排序,所以無需使用NestedQueryBuilder
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("bbsSubjectEsVos.subjectId", searchVo.getSubjectId());
        nestedSort.setFilter(termQueryBuilder);
         SortBuilder<?> sortBuilderOrder = SortBuilders.fieldSort("bbsSubjectEsVos.order").order( SortOrder.DESC).setNestedSort(nestedSort);
         queryBuilder.withSort(sortBuilderOrder);
        // 價格順序
        SortBuilder<?> sortBuilderPrice = SortBuilders.fieldSort("bbsSalePriceEsVo.price").order( SortOrder.ASC);
        queryBuilder.withSort(sortBuilderPrice);
    }

生成的程式碼查詢語句。