【郑州校区】学成在线-第11天-讲义-搜索服务 六
4.4.3 分页与高亮
[AppleScript] 纯文本查看 复制代码 @Service
public class EsCourseService {
private static final Logger LOGGER = LoggerFactory
.
getLogger(EsCourseService.class);
@Value(
"
${xuecheng
.elasticsearch.course.index}
"
)
private String es_index;
@Value(
"
${xuecheng
.elasticsearch.course.type}
"
)
private String es_type;
@Value(
"
${xuecheng
.elasticsearch.course.source_field}
"
)
private String source_field;
@Autowired
RestHighLevelClient restHighLevelClient;
public QueryResponseResult<CoursePub> list(int page,int size,CourseSearchParam
courseSearchParam) {
//设置索引
SearchRequest searchRequest
= new SearchRequest(es_index);
//设置类型
searchRequest.types(es_type);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder =
QueryBuilders.boolQuery();
//source源字段过虑
String[] source_fields
=
source_field.split(
"
,
"
);
searchSourceBuilder.fetchSource(source_fields, new String[]{});
//关键字
if(StringUtils.isNotEmpty(courseSearchParam.
getKeyword())){
//匹配关键字
MultiMatchQueryBuilder multiMatchQueryBuilder =
QueryBuilders.multiMatchQuery(courseSearchParam.
getKeyword(),
"
name
"
,
"
teachplan
"
,
"
description
"
);
//设置匹配占比
multiMatchQueryBuilder.minimumShouldMatch(
"
70%
"
);
//提升另个字段的Boost值
multiMatchQueryBuilder.field(
"
name
"
,10);
boolQueryBuilder.must(multiMatchQueryBuilder);
}
//过虑
if(StringUtils.isNotEmpty(courseSearchParam.
getMt())){
boolQueryBuilder.filter(QueryBuilders.termQuery(
"
mt
"
,courseSearchParam.
getMt()));
}
if(StringUtils.isNotEmpty(courseSearchParam.
getSt())){
boolQueryBuilder.filter(QueryBuilders.termQuery(
"
st
"
,courseSearchParam.
getSt()));
}
if(StringUtils.isNotEmpty(courseSearchParam.
getGrade())){
boolQueryBuilder.filter(QueryBuilders.termQuery(
"
grade
"
,courseSearchParam.
getGrade()));
}
//分页
if(page<
=
0){
page
= 1;
}
if(size<
=
0){
size
= 20;
}
int start
=
(page
‐
1)
*
size;
searchSourceBuilder.from(start);
searchSourceBuilder.size(size);
//布尔查询
searchSourceBuilder.
query(boolQueryBuilder);
//高亮设置
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.
preTags(
"
<font class
=
'
eslight
'
>
"
);
highlightBuilder.
postTags(
"
</font>
"
);
//设置高亮字段
highlightBuilder.fields()
.add(new HighlightBuilder.Field(
"
name
"
));
searchSourceBuilder.highlighter(highlightBuilder);
//请求搜索
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse
= null;
try {
searchResponse
= restHighLevelClient.search(searchRequest);
} catch (IOException e) {
e.
printStackTrace();
LOGGER.error(
"
xuecheng search error..
{}
"
,e.
getMessage());
return new QueryResponseResult(CommonCode.SUCCESS,new QueryResult<CoursePub>());
}
//结果集处理
SearchHits hits
=
searchResponse.
getHits();
SearchHit[] searchHits
= hits.
getHits();
//记录总数
long totalHits
= hits.
getTotalHits();
//数据列表
List<CoursePub> list
= new ArrayList<>();
for (SearchHit hit : searchHits) {
CoursePub coursePub
= new CoursePub();
//取出source
Map<String, Object> sourceAsMap
= hit.
getSourceAsMap();
//取出名称
String name
=
(String) sourceAsMap
.
get(
"
name
"
);
//取出高亮字段内容
Map<String, HighlightField> highlightFields
= hit.
getHighlightFields();
if(highlightFields!
=null){
HighlightField nameField
= highlightFields.
get(
"
name
"
);
if(nameField!
=null){
Text[] fragments
= nameField.
getFragments();
StringBuffer stringBuffer = new StringBuffer();
for (Text str : fragments) {
stringBuffer.append(str.string());
}
name
=
stringBuffer.toString();
}
}
coursePub.setName(name);
//图片
String pic
=
(String) sourceAsMap
.
get(
"
pic
"
);
coursePub.setPic(pic);
//价格
Float price
= null;
try {
if(sourceAsMap
.
get(
"
price
"
)!
=null ){
price
= Float.
parseFloat((String) sourceAsMap
.
get(
"
price
"
));
}
} catch (Exception e) {
e.
printStackTrace();
}
coursePub.setPrice(price);
Float price_old
= null;
try {
if(sourceAsMap
.
get(
"
price_old
"
)!
=null ){
price_old
= Float.
parseFloat((String) sourceAsMap
.
get(
"
price_old
"
));
}
} catch (Exception e) {
e.
printStackTrace();
}
coursePub.setPrice_old(price_old);
list.add(coursePub);
}
QueryResult<CoursePub> queryResult
= new QueryResult<>();
queryResult.setList(list);
queryResult.setTotal(totalHits);
QueryResponseResult<CoursePub> coursePubQueryResponseResult
= new
QueryResponseResult<CoursePub>(CommonCode.SUCCESS,queryResult);
return coursePubQueryResponseResult;
}
}
4.5 Controller
[AppleScript] 纯文本查看 复制代码 @RestController
@RequestMapping(
"
/search/course
"
)
public class EsCourseController implements EsCourseControllerApi {
@Autowired
EsCourseService esCourseService;
@Override
@GetMapping(value
=
"
/list/{page}/{size}
"
)
public QueryResponseResult<CoursePub> list(@PathVariable(
"
page
"
) int page,
@PathVariable(
"
size
"
) int size, CourseSearchParam courseSearchParam) throws IOException {
return esCourseService.list(page,size,courseSearchParam);
}
}
4.5 测试
使用postman测试/search/course
|