在查询的时候希望,查询结果中的包含查询关键字高亮。(Es版本,6.5.4)
- 前提准备,首先建立mapping
POST http://47.101.167.46:9200/hello_es/doc/_mapping
{
"properties": {
"name": {
"type": "text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_smart"
},
"description": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer":"ik_smart"
}
}
}
- 添加文档
IndexRequest indexRequest = new IndexRequest("hello_es", "doc");
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("name", "曾经沧海难为水");
jsonMap.put("description", "本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud基础入门3.实战SpringBoot4.注册中心eureka");
indexRequest.source(jsonMap);
client.index(indexRequest, RequestOptions.DEFAULT);
- RestClient查询文档
{
"query": {
"match": {
"name": "曾经"
}
},
"highlight": {
"pre_tags": ["<tag1>"],
"post_tags": ["</tag2>"],
"fields": {
"name": {
"type": "plain"
}
}
}
}
SearchRequest searchRequest = new SearchRequest("hello_es");
searchRequest.types("doc");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("name","曾经"));
searchSourceBuilder.fetchSource(new String[]{"name", "description"}, Strings.EMPTY_ARRAY);
// 设置高亮字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.requireFieldMatch(true).field("name")
.preTags("<strong>").postTags("</strong>");
searchSourceBuilder.highlighter(highlightBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
Stream.of(searchHits).forEach(model -> {
String sourceAsString = model.getSourceAsString();
Map<String, HighlightField> highlightFields = model.getHighlightFields();
String name = (String) model.getSourceAsMap().get("name");
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();
}
}
log.info("name:{}=====sourceAsString:{}", name, sourceAsString);
});
- ElasticsearchTemplate 高亮方式
String preTag = "<font color='#dd4b39'>";//google的色值
String postTag = "</font>";
SearchQuery searchQuery = new NativeSearchQueryBuilder().
withQuery(matchQuery("name","曾经")).
withHighlightFields(new HighlightBuilder.Field("name").preTags(preTag).postTags(postTag),
new HighlightBuilder.Field("description").preTags(preTag).postTags(postTag)).build();
List<HelloES> helloES = elasticsearchTemplate.queryForList(searchQuery, HelloES.class);
System.out.println(helloES);
// 高亮字段
AggregatedPage<HelloES> ideas = elasticsearchTemplate.queryForPage(searchQuery, HelloES.class, new SearchResultMapper() {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
List<HelloES> chunk = new ArrayList<>();
for (SearchHit searchHit : response.getHits()) {
if (response.getHits().getHits().length <= 0) {
return null;
}
HelloES idea = new HelloES();
String sourceAsString = searchHit.getSourceAsString();
System.out.println(sourceAsString);
//name or memoe
HighlightField ideaTitle = searchHit.getHighlightFields().get("name");
if (ideaTitle != null) {
idea.setName(ideaTitle.fragments()[0].toString());
}
HighlightField ideaContent = searchHit.getHighlightFields().get("description");
if (ideaContent != null) {
idea.setDescription(ideaContent.fragments()[0].toString());
}
chunk.add(idea);
}
if (chunk.size() > 0) {
return new AggregatedPageImpl<>((List<T>) chunk);
}
return null;
}
});
ideas.get().forEach(model -> {
System.out.println(model.getName());
});
总结:这里需要注意的是建立索引的时候,插入索引使用粗力度,搜索使用细粒度。
github地址: https://github.com/fafeidou/fast-cloud-nacos/tree/master/fast-common-examples ,如果喜欢,请给个star,谢谢。