環境搭建這裏就不介紹,只貼上關鍵的代碼供大家參考!
<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);
}
聚合結果: