package com.heima.search.service.impl;标签:search,dto,title,查询,elasticsearch,org,import,es From: https://www.cnblogs.com/ZhangZiXue/p/17498558.html
import com.alibaba.fastjson.JSON;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.search.dtos.UserSearchDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.search.model.UserSearchDto.UserSearchDto;
import com.heima.search.service.ApUserSearchService;
import com.heima.search.service.ArticleSearchService;
import com.heima.utils.thread.AppThreadLocalUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.avro.data.Json;
import org.apache.commons.lang3.StringUtils;
import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.index.query.*;
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.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service
@Slf4j
public class ArticleSearchServiceImpl implements ArticleSearchService {
@Autowired
private RestHighLevelClient restHighLevelClient;
@Autowired
private ApUserSearchService apUserSearchService;
/**
* es文章分页检索
*
* @param dto
* @return
*/
@Override
public ResponseResult search(UserSearchDto dto) throws IOException {
// if(StringUtils.isBlank(dto.getSearchWords()) || null == dto){
// return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
// }
//
// SearchRequest request = new SearchRequest("app_info_article");
// SearchSourceBuilder builder = new SearchSourceBuilder();
// //关键词的分词之后查询
// QueryStringQueryBuilder queryStringQueryBuilder1 = QueryBuilders.queryStringQuery(dto.getSearchWords()).
// field("title").field("content").defaultOperator(Operator.OR);
// //小于mindate的数据
// BoolQueryBuilder boolQueryBuilder1 = QueryBuilders.boolQuery();
// //range就是根据某个范围来进行查询 同时是getTime毫秒值就是时间戳的意思
// RangeQueryBuilder publishTime = QueryBuilders.rangeQuery("publishTime").lt(dto.getMinBehotTime().getTime());
// boolQueryBuilder1.filter(publishTime);
// //分页查询
// builder.from(0);
// builder.size(dto.getPageSize());
// //按照发布时间倒序排序
//
// request.source().sort("publishTime",SortOrder.DESC);
//
//
// //高亮
//
// HighlightBuilder highlightBuilder = new HighlightBuilder();
// highlightBuilder.field("title");
// //高亮的颜色和字体
// builder.highlighter(highlightBuilder);
//
// highlightBuilder.preTags();
// highlightBuilder.postTags();
// builder.query(boolQueryBuilder1);
// request.source(builder);
// SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
//
//1.检查参数
if(dto == null || StringUtils.isBlank(dto.getSearchWords())){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
ApUser user = AppThreadLocalUtil.getUser();
//异步调用 保存搜索记录
if(user != null && dto.getFromIndex() == 0){
apUserSearchService.insert(dto.getSearchWords(), user.getId());
}
//2.设置查询条件
SearchRequest searchRequest = new SearchRequest("app_info_article");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//布尔查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//关键字的分词之后查询
QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery(dto.getSearchWords()).field("title").field("content").defaultOperator(Operator.OR);
boolQueryBuilder.must(queryStringQueryBuilder);
//查询小于mindate的数据 同时是getTime毫秒值就是时间戳的意思
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("publishTime").lt(dto.getMinBehotTime().getTime());
boolQueryBuilder.filter(rangeQueryBuilder);
//分页查询
searchSourceBuilder.from(0);
searchSourceBuilder.size(dto.getPageSize());
//按照发布时间倒序查询
searchSourceBuilder.sort("publishTime", SortOrder.DESC);
//设置高亮 title
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("title");
highlightBuilder.preTags("<font style='color: red; font-size: inherit;'>");
highlightBuilder.postTags("</font>");
searchSourceBuilder.highlighter(highlightBuilder);
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//3.结果封装返回
List<Map> list = new ArrayList<>();
//hit 是命中数
SearchHits hits1 = searchResponse.getHits();
//命中的总条数
TotalHits totalHits = hits1.getTotalHits();
// SearchHit[] hits2 = searchResponse.getHits().getHits();
// for (SearchHit documentFields : hits2) {
// String sourceAsString = documentFields.getSourceAsString();
// Map map = JSON.parseObject(sourceAsString, Map.class);
// }
SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit hit : hits) {
String json = hit.getSourceAsString();
Map map = JSON.parseObject(json, Map.class);
//处理高亮
if(hit.getHighlightFields() != null && hit.getHighlightFields().size() > 0){
//同时可能有多个高亮,需要同时拿到
Text[] titles = hit.getHighlightFields().get("title").getFragments();
String title = StringUtils.join(titles);
//高亮标题
map.put("h_title",title);
}else {
//原始标题
map.put("h_title",map.get("title"));
}
list.add(map);
}
return ResponseResult.okResult(list);
}
}