如何为同一字段配置不同highlight规则返回多份高亮结果
Elasticsearch 同字段多配置高亮实现方案
你之前的写法无法生效的原因是:highlight.fields下的键默认需要匹配索引中真实存在的字段,你自定义的doc_body_short不是实际存储的字段,ES无法匹配到对应内容,所以不会返回预期的高亮结果。
以下是两种可行的实现方案:
方案1:使用高亮name参数(适用于Elasticsearch 7.10及以上版本)
这是官方原生支持的最优方案,无需修改索引结构,直接对同一个字段配置多组高亮规则,通过name参数指定返回结果的自定义键名即可。
请求示例:
{ "query": { "match": { "doc_body": "你的搜索关键词" } }, "highlight": { "fields": [ { "doc_body": { "fragment_size": 200000, "name": "doc_body_full" } }, { "doc_body": { "fragment_size": 100, "name": "doc_body_short" } } ] } }
返回结果的highlight字段下会直接生成doc_body_full和doc_body_short两个自定义键,分别对应两种长度的高亮片段。
方案2:使用copy_to映射冗余字段(适用于所有ES版本)
如果你的ES版本低于7.10,不支持name参数,可以通过新增冗余同步字段实现:
- 首先调整索引mapping,新增和
doc_body内容完全同步的冗余字段:
PUT /你的索引名称/_mapping { "properties": { "doc_body": { "type": "text", "copy_to": "doc_body_copy" }, "doc_body_copy": { "type": "text" // 分词、索引规则保持和doc_body一致即可 } } }
- 调整高亮查询配置,分别对两个内容一致的字段设置不同的
fragment_size:
{ "query": { "match": { "doc_body": "你的搜索关键词" } }, "highlight": { "fields": { "doc_body": { "fragment_size": 200000 }, "doc_body_copy": { "fragment_size": 100 } } } }
该方案的优点是全版本兼容,缺点是会占用少量额外的存储资源。
内容的提问来源于stack exchange,提问作者sam-jg
相关产品推荐
相关产品推荐

