*
package com.coolman.hotel.test;
import com.coolman.hotel.pojo.HotelDoc;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
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.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
/**
* 高亮显示
*/
@SpringBootTest
public class HighLightQueryTest {
@Autowired
private RestHighLevelClient restHighLevelClient;
//jackson
private final ObjectMapper objectMapper = new ObjectMapper();
@Test
public void testHighLightSearch() throws IOException {
// 1. 创建查询请求对象
SearchRequest searchRequest = new SearchRequest("hotel");
// 2. 添加查询请求体
HighlightBuilder highlightBuilder = new HighlightBuilder();
// 添加高亮字段方式1(暂时不知道什么区别,了解就好)
// highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
// highlightBuilder.fields().add(new HighlightBuilder.Field("brand"));
// 添加高亮字段方式2
highlightBuilder.field("name");
highlightBuilder.field("brand");
// 这里相当于是全局的配置,也可以在上面添加配置,如 highlightBuilder.field("name").requireFieldMatch(false).postTags("...").preTags("...");
highlightBuilder.requireFieldMatch(false).preTags("").postTags("");
searchRequest.source().query(
QueryBuilders.matchQuery("name", "如家")
).highlighter(highlightBuilder);
// 3. 执行操作,获取响应数据
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 4. 处理响应数据
handlerResponse(response);
}
/**
* 用来处理响应数据(相当于解析返回的JSON数据)
* @param response
*/
private void handlerResponse(SearchResponse response) throws JsonProcessingException {
// 1. 得到命中的数量(即总记录数量)
SearchHits hits = response.getHits();
long totalCount = hits.getTotalHits().value;// 总记录数
System.out.println("总记录数量为:" + totalCount);
// 2. 获取本次查询出来的列表数据
SearchHit[] hitsArray = hits.getHits();
for (SearchHit hit : hitsArray) {
// 得到json字符串
String json = hit.getSourceAsString();
// 将json字符串转换为实体类对象
HotelDoc hotelDoc = objectMapper.readValue(json, HotelDoc.class);
// 处理高亮的情况
Map highlightFields = hit.getHighlightFields();
if (highlightFields.size() > 0) {
if (highlightFields.get("name") != null) {
Text nameHighLight = highlightFields.get("name").fragments()[0];
hotelDoc.setName(nameHighLight.toString());
}
if (highlightFields.get("brand") != null) {
Text brandHighLight = highlightFields.get("brand").fragments()[0];
hotelDoc.setBrand(brandHighLight.toString());
}
}
System.out.println(hotelDoc);
}
}
}
Original: https://www.cnblogs.com/OnlyOnYourself-lzw/p/16570857.html
Author: OnlyOnYourself-Lzw
Title: 06-ElasticSearch搜索结果处理
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/619779/
转载文章受原作者版权保护。转载请注明原作者出处!