elasticsearch 5.x highlight 高亮

public static Map<String, Object> search(String key,String index,String type,int start,int row){

//创建查询索引,要查询的索引库为index
SearchRequestBuilder builder = getClient().prepareSearch(index);
builder.setTypes(type);
builder.setFrom(start);
builder.setSize(row);

//设置查询类型:1.SearchType.DFS_QUERY_THEN_FETCH 精确查询; 2.SearchType.SCAN 扫描查询,无序
builder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
if(StringUtils.isNotBlank(key)){
// 设置查询关键词
builder.setQuery(QueryBuilders.multiMatchQuery(key, "title","describe"));
}

//设置是否按查询匹配度排序

builder.setExplain(true);

//设置高亮显示
HighlightBuilder highlightBuilder = new HighlightBuilder().field("*").requireFieldMatch(false);
highlightBuilder.preTags("<span style=\"color:red\">");
highlightBuilder.postTags("</span>");
builder.highlighter(highlightBuilder);


//执行搜索,返回搜索响应信息
SearchResponse searchResponse = builder.get();
SearchHits searchHits = searchResponse.getHits();

//总命中数
long total = searchHits.getTotalHits();
Map<String, Object> map = new HashMap<String,Object>();
SearchHit[] hits = searchHits.getHits();
map.put("count", total);
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (SearchHit hit : hits) {
//highlightFields.size=0??
Map<String, HighlightField> highlightFields = hit.getHighlightFields();

//title高亮
HighlightField titleField = highlightFields.get("title");
Map<String, Object> source = hit.getSource();
if(titleField!=null){
Text[] fragments = titleField.fragments();
String name = "";
for (Text text : fragments) {
name+=text;
}
source.put("title", name);
}

//describe高亮
HighlightField describeField = highlightFields.get("describe");
if(describeField!=null){
Text[] fragments = describeField.fragments();
String describe = "";
for (Text text : fragments) {
describe+=text;
}
source.put("describe", describe);
}
list.add(source);
}
map.put("dataList", list);
return map;
}
Spring Data Elasticsearch 5 提供了对高亮查询结果的支持。要实现高亮,需要使用Elasticsearchhighlighting API。 在Spring Data Elasticsearch中,可以使用`HighlightBuilder`类来构建高亮查询,然后将其添加到查询构建器中。以下是一个简单的示例: ```java HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field("title"); //设置要高亮的字段 NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("title", "spring data")) .withHighlightBuilder(highlightBuilder) //将HighlightBuilder添加到查询构建器中 .build(); SearchHits<Article> searchHits = elasticsearchRestTemplate.search(searchQuery, Article.class); for (SearchHit<Article> hit : searchHits) { String title = hit.getHighlightFields().get("title").get(0); //获取高亮结果 // ... } ``` 在上面的示例中,`HighlightBuilder`对象设置了要高亮的字段,然后将其添加到`NativeSearchQuery`对象中。执行搜索后,可以使用`SearchHit`对象获取高亮结果。 值得注意的是,要使高亮生效,必须在索引中启用高亮设置。在创建索引时,可以通过设置`mapping`来启用高亮。例如: ```json { "mappings": { "properties": { "title": { "type": "text", "analyzer": "standard" }, "content": { "type": "text", "analyzer": "standard" }, "publishDate": { "type": "date" } }, "highlight": { "fields": { "title": {}, "content": {} } } } } ``` 在上面的示例中,`highlight`对象定义了要高亮的字段。将此映射应用于索引后,就可以在搜索时使用高亮了。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值