1. 程式人生 > >elasticsearch-填坑

elasticsearch-填坑

1、分頁引數 ,start=(page-1)*size

2、高亮欄位結果的處理方式

3、float型別引數從map中取出用double接收

4、結果封裝需手動封裝

package com.search.service;

import java.util.ArrayList;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.text.Text; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.MultiMatchQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder.Field; import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.xuecheng.framework.domain.course.CoursePub; import com.xuecheng.framework.domain.search.CourseSearchParam; import com.xuecheng.framework.exception.ExceptionCast; import com.xuecheng.framework.model.response.QueryResponseResult; import com.xuecheng.framework.model.response.QueryResult; import com.xuecheng.framework.model.response.ResponseResult; import com.xuecheng.framework.resultCode.EsCode; import com.xuecheng.framework.resultCode.common.CommonCode; import com.xuecheng.search.config.EsConfig; @Service public class EsCourseService { @Autowired private EsConfig config; @Autowired private RestHighLevelClient client; public ResponseResult list(int page,int size,CourseSearchParam params){ if(params==null){ ExceptionCast.cast(CommonCode.NULL_PARAM); } //關鍵字查詢 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); if(StringUtils.isNotBlank(params.getKeyword())){ MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery(params.getKeyword(), "name","teachplan","descripe") .minimumShouldMatch("70%") .field("name", 10); boolQuery.must(multiMatchQuery); } //一節分類 if(StringUtils.isNotBlank(params.getMt())){ boolQuery.filter(QueryBuilders.termQuery("mt", params.getMt())); } //二級分類 if(StringUtils.isNotBlank(params.getSt())){ boolQuery.filter(QueryBuilders.termQuery("st", params.getSt())); } //課程難度 if(StringUtils.isNotBlank(params.getGrade())){ boolQuery.filter(QueryBuilders.termQuery("grade", params.getGrade())); } //高亮 HighlightBuilder hlb = new HighlightBuilder(); hlb.preTags("<font class='esClass'>") .postTags("</font>") .fields().add(new Field("name"));//設定name高亮 SearchSourceBuilder ssb = new SearchSourceBuilder(); if(config.getSourceFields()==null){ ExceptionCast.cast(EsCode.READ_CONFIG_PARAM_FAIL); } if(page<=0){ page=1; } if(size<=0){ size=20; } ssb.fetchSource(config.getSourceFields().toArray(new String[]{}), new String[]{}) .from((page-1)*size) //start計算細節需要注意 .size(size) .query(boolQuery) .highlighter(hlb); //sr SearchRequest sr = new SearchRequest(config.getIndex()); sr.types(config.getType()); sr.source(ssb); SearchResponse response = null; try { response = client.search(sr); } catch (Exception e) { return new ResponseResult(CommonCode.SUCCESS); } SearchHits hits = response.getHits(); ArrayList<CoursePub> list = new ArrayList<CoursePub>(); for(SearchHit hit:hits){ CoursePub coursePub = new CoursePub(); //1、設定name Map<String, Object> map = hit.getSourceAsMap(); //取出名稱 String name = (String)map.get("name"); //取出高亮欄位 Map<String, HighlightField> highLighfields = hit.getHighlightFields(); if(highLighfields!=null){ HighlightField nameField = highLighfields.get("name"); if(nameField!=null){ Text[] fragments = nameField.getFragments(); StringBuffer stringBuffer = new StringBuffer(); for(Text fragment:fragments){ stringBuffer.append(fragment.string()); } name = stringBuffer.toString(); } } coursePub.setName(name); //2、設定pic String pic = (String)map.get("pic"); coursePub.setPic(pic); //3、價格 Double price = (Double)map.get("price"); coursePub.setPrice(price); //4、原價 Double old_price = (Double)map.get("old_price"); coursePub.setPriceOld(old_price); list.add(coursePub); } QueryResult<CoursePub> qr = new QueryResult<>(); qr.setList(list); qr.setTotal(hits.getTotalHits()); return new QueryResponseResult<>(CommonCode.SUCCESS, qr); } }