ElasticsearchRepository條件查詢+分頁+排序+字段聚合

環境搭建這裏就不介紹,只貼上關鍵的代碼供大家參考!

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
	</dependency>
涉及中英文,這裏只貼出部分
package cn.sciencedb.common.domain.es;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;
import java.util.Date;

/**
 * ElasticSearch 索引科學數據對象-英文
 * 
 * @author 張益達
 * @date 2018-08-13
 */

@Getter
@Setter
@ToString
@Document(indexName = "dataset_index_en", type = "dataset")
public class DataSetIndexEn implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    private String id;// ES 主鍵

    @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
    private String title;// 數據集標題

    @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
    private String introduction;// 數據集簡介

    @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
    private String keyword;// 關鍵字

    private String author;// 數據集作者

    private String dataSetType;// 數據集類型

    private Date publishDate;// 數據集發佈時間

    private String dataSetId; // 數據集id

    private String code;    //數據集標識 對應projectId

    private String taxonomy;    //學科

    private String pictureUrl; //圖ong片url

    private long viewCount; //瀏覽數
}

controller

/**
     * 熱門數據
     * @param code 數據集標識 對應projectId
     * @param dataSetType 數據集類型
     * @param locale 國際化
     * @return
     */
    @ApiOperation("熱門數據")
    @GetMapping("/recommend2")
    public SdbResult recommend2(@RequestParam(name = "page", required = false, defaultValue = "0") String page,
                                @RequestParam(name = "size", required = false, defaultValue = "10") String size,
                                @RequestParam(name = "code", required = false) String code,
                                @RequestParam(name = "dataSetType", required = false) String dataSetType,
                                Locale locale) {
        // 獲取分頁參數
        int pageNum = Integer.parseInt(page);
        int pageSize = Integer.parseInt(size);
        Pageable pageable = PageRequest.of(pageNum, pageSize);
        return searchService.recommendData2(code, dataSetType, locale,pageable);
    }

這裏是重點!!!
serviceimpl

	/**
     * 檢索聚合查詢,這裏對taxonomy(學科分類進行聚合)
     * @param params
     * @return
     */
    @Override
    public SdbResult searchQuery(String q, String dataSetType, String taxonomy, String code, String username, boolean ordertime, boolean orderinfluence, String page, String size, Locale locale) {

        Map<String, Object> map = Maps.newHashMap();
        Pageable pageable = PageRequest.of(Integer.parseInt(page), Integer.parseInt(size));
        //檢索條件
        BoolQueryBuilder bqb = QueryBuilders.boolQuery();
        if(StringUtils.isNotEmpty(dataSetType))
            bqb.must(QueryBuilders.matchPhraseQuery("dataSetType", dataSetType));
        if(StringUtils.isNotEmpty(code))
            bqb.must(QueryBuilders.matchPhraseQuery("code", code));
        if(StringUtils.isNotEmpty(taxonomy))
            bqb.must(QueryBuilders.matchPhraseQuery("taxonomy", taxonomy));
        if(StringUtils.isNotEmpty(q))
            bqb.must(QueryBuilders.multiMatchQuery(q, "title", "keyword", "introduction"));
        //排序條件
        FieldSortBuilder fsb = null;
        if(ordertime){
            fsb = SortBuilders.fieldSort("publishDate").order(SortOrder.DESC);
        }
        if(orderinfluence){
            fsb = SortBuilders.fieldSort("referenceNumber").order(SortOrder.DESC);
        }
		//聚合條件
        TermsAggregationBuilder builder1 = AggregationBuilders.terms("taxonomy").field("taxonomy.keyword");
        TermsAggregationBuilder builder2 = AggregationBuilders.terms("year").field("year.keyword");
        TermsAggregationBuilder builder = builder1.subAggregation(builder2);
        //構建查詢
        SearchQuery query = new NativeSearchQueryBuilder()
                .withQuery(bqb)
                .withSort(fsb)
                .addAggregation(builder)
                .withPageable(pageable)
                .build();
        if ("en".equals(locale.getLanguage())) {
            AggregatedPage<DataSetIndexEn> search = (AggregatedPage)sdoIndexEnRepository.search(query);
            long totalElements = search.getTotalElements();
            int totalPages = search.getTotalPages();
            List<DataSetIndexEn> content = search.getContent();
			Terms term1 = (Terms)search.getAggregations().getAsMap().get("taxonomy");
            log.debug("term1============"+term1.toString());
            for (Terms.Bucket bucket : term1.getBuckets()) {
                log.debug("一級內容"+bucket.toString());
                map.put(bucket.getKey().toString(), bucket.getDocCount());
                Terms terms_year = bucket.getAggregations().get("year");
                for (Terms.Bucket year_bucket : terms_year.getBuckets()) {
                    log.debug("二級內容"+year_bucket.toString());
                    map.put(year_bucket.getKey().toString(), year_bucket.getDocCount());
                }
            }
            map.put("total",totalElements);
            map.put("totalPages",totalPages);
            map.put("recommendData",content);
        } else {
            AggregatedPage<DataSetIndexZh> search = (AggregatedPage)sdoIndexZhRepository.search(query);
            long totalElements = search.getTotalElements();
            int totalPages = search.getTotalPages();
            List<DataSetIndexZh> content = search.getContent();
			Terms term1 = (Terms)search.getAggregations().getAsMap().get("taxonomy");
            log.debug("term1============"+term1.toString());
            for (Terms.Bucket bucket : term1.getBuckets()) {
                log.debug("一級內容"+bucket.toString());
                map.put(bucket.getKey().toString(), bucket.getDocCount());
                Terms terms_year = bucket.getAggregations().get("year");
                for (Terms.Bucket year_bucket : terms_year.getBuckets()) {
                    log.debug("二級內容"+year_bucket.toString());
                    map.put(year_bucket.getKey().toString(), year_bucket.getDocCount());
                }
            }
            map.put("total",totalElements);
            map.put("totalPages",totalPages);
            map.put("recommendData",content);
        }
        return success(map);
    }

 	/**
     * 獲取最近更新數據集
     *
     * @param code
     * @param dataSetType
     * @param locale 國際化
     * @return SdbResult
     */
    @Override
    public SdbResult latestData(String code, String dataSetType, Locale locale) {
        String language = locale.getLanguage();
        Map<String, Object> map = Maps.newHashMap();
        //創建查詢條件
        BoolQueryBuilder builder = QueryBuilders.boolQuery();
        if(StringUtils.isNotEmpty(code))
            builder.must(QueryBuilders.matchPhraseQuery("code", code));
        if(StringUtils.isNotEmpty(dataSetType))
            builder.must(QueryBuilders.matchPhraseQuery("dataSetType", dataSetType));

        if("en".equals(language)){
        	//使用PageRequest of進行排序
            Pageable pageable = PageRequest.of(1, 8, Sort.Direction.DESC, "publishDate");
            List<DataSetIndexEn> content = sdoIndexEnRepository.search(builder,pageable).getContent();
            map.put("latest",content);
        }else{
            Pageable pageable = PageRequest.of(0, 8, Sort.Direction.DESC, "publishDate");
            List<DataSetIndexZh> content = sdoIndexZhRepository.search(builder,pageable).getContent();
            map.put("latest",content);
        }

        return success(map);
    }

Repository

/**
 * 中文數據Repository
 * 
 * @author 張益達
 * @date 2018年8月23日
 */
@Repository
public interface DataSetZhRepository extends ElasticsearchRepository<DataSetIndexZh, String> {

    List<DataSetIndexZh> findByDataSetType(String dataSetType, Pageable pageable);

    List<DataSetIndexZh> findByCode(String code,Pageable pageable);

    List<DataSetIndexZh> findByCodeAndDataSetType(String code, String dataSetType, Pageable pageable);

    DataSetIndexZhfindByDataSetId(String dataSetId);
}

聚合結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章