package com.zyyt.api.web;
import cn.hutool.core.collection.CollectionUtil;
import com.zyyt.commons.vo.es.SearchResponseVO;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.RequestOptions;
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.Operator;
import org.elasticsearch.index.query.QueryBuilders;
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.HighlightField;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created by niudongdong on 2021/4/26.
*/
@Controller
public class EsHighlightController {
@Autowired
private RestHighLevelClient restHighLevelClient;
@GetMapping("/test/es")
public void aaa() throws IOException {
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("news_alias");
searchRequest.types("news");
searchRequest.searchType(SearchType.QUERY_THEN_FETCH);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
String keyword = "Premier League set to kick off Island";
keyword ="ha";
//boolQueryBuilder.must(QueryBuilders.multiMatchQuery(keyword, "title", "text").type(MultiMatchQueryBuilder.Type.PHRASE));
//boolQueryBuilder.must(QueryBuilders.queryStringQuery("(\"" + keyword + "\")").field("title").field("text").field("website_name").field("domain").defaultOperator(Operator.OR));
boolQueryBuilder.must(QueryBuilders.queryStringQuery(keyword ).field("title").field("text").field("website_name").field("domain").defaultOperator(Operator.OR));
//搜索源构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQueryBuilder);
searchSourceBuilder.from(0);
searchSourceBuilder.size(10);
int fragmentSize = 100;
int numberOfFragments = 0;
//高亮
HighlightBuilder highlightBuilder = new HighlightBuilder().field("text", fragmentSize, numberOfFragments)
.field("title", fragmentSize, numberOfFragments)
.field("webstie_name", fragmentSize, numberOfFragments);
highlightBuilder.preTags("<b style='color:blue;'>");
highlightBuilder.postTags("</b>");
searchSourceBuilder.highlighter(highlightBuilder);
//将SearchSourceBuilder对象添加到搜索请求中
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
SearchResponseVO<Map<String, Object>> searchResponseVO = new SearchResponseVO<>();
searchResponseVO.setTotalCount(searchHits.getTotalHits());
List<Map<String, Object>> list = new ArrayList<>();
searchHits.iterator().forEachRemaining(hit -> {
Map<String, HighlightField> highLightFieldMap = hit.getHighlightFields();
if (highLightFieldMap != null && !highLightFieldMap.isEmpty()) {
for (String lightField : highLightFieldMap.keySet()) {
Text[] texts = highLightFieldMap.get(lightField).getFragments();
if (texts != null && texts.length > 0) {
System.out.println(lightField +"-----"+ texts[0].toString());
System.out.println(hit.getSourceAsMap().get(lightField));
hit.getSourceAsMap().put(lightField, texts[0].toString());
}
}
}
list.add(hit.getSourceAsMap());
});
}
}