Elasticsearch7如何配置返回内嵌高亮标签的搜索结果(Spring Data ES场景)
实现方案
你要的功能Spring Data Elasticsearch已经提供了原生支持,不需要手动处理字段映射合并,以下是两种可选配置方式:
- 全局配置方式
直接在Spring Boot配置文件中添加配置即可全局开启高亮结果自动合并到_source字段:
yml格式示例:
spring: elasticsearch: rest: highlight-source: true
properties格式示例:
spring.elasticsearch.rest.highlight-source=true
该配置适用于Spring Data Elasticsearch 4.2及以上版本,和你使用的Elasticsearch 7.15版本适配的Spring Data版本范围完全匹配。
- 单查询独立配置方式
如果不需要全局生效,仅针对特定查询开启该特性,可在构造查询时手动开启:
// 构造高亮查询 HighlightQuery query = new SimpleHighlightQuery( new MatchQueryBuilder("message", "搜索关键词") ); // 配置高亮规则 HighlightBuilder.Field highlightField = new HighlightBuilder.Field("message") .preTags("<em>") .postTags("</em>") .numOfFragments(10); query.addHighlightField(highlightField); // 开启高亮合并到_source开关 query.setHighlightSource(true); // 执行查询 SearchHits<DocEntity> result = elasticsearchOperations.search(query, DocEntity.class);
如果使用ElasticsearchRepository接口方式定义查询,可直接在查询方法上添加注解配置:
@Highlight( fields = {@HighlightField(name = "message")}, preTags = "<em>", postTags = "</em>", highlightSource = true ) List<SearchHit<DocEntity>> findByMessageContains(String keyword);
注意事项
开启该配置后,如果字段配置了多片段返回(numOfFragments>1),对应_source的字段值会自动转为数组类型,和你给出的预期返回格式完全一致;如果需要返回单个字符串,可将numOfFragments设置为1即可。
内容的提问来源于stack exchange,提问作者AR1
相关产品推荐
相关产品推荐

