搜索时如何获取Elasticsearch的Token Payloads结构化结果?
可行方案说明
当然可以实现「返回结构化payload + 纯文本高亮」的需求,不用再费劲从高亮结果里解析payload,具体思路如下:
1. 调整索引映射
新增一个纯文本字段专门用于高亮,原字段保留带payload的分词逻辑。比如:
{ "mappings": { "properties": { "content_with_payload": { "type": "text", "analyzer": "your_payload_analyzer" // 你定义的带delimited payload filter的分析器 }, "content_plain": { "type": "text", "analyzer": "standard" // 用普通分析器生成不带payload的分词 } } } }
写入文档时,两个字段存相同的原始文本就行,Elasticsearch会自动分别处理。
2. 查询时的配置
执行match_phrase查询时,针对带payload的字段(content_with_payload)做匹配,同时:
- 用
script_fields直接提取结构化的payload - 指定高亮字段为纯文本字段(
content_plain),这样高亮结果就是干净的纯文本
示例查询DSL
{ "query": { "match_phrase": { "content_with_payload": "你的搜索文本" } }, "highlight": { "fields": { "content_plain": {} } }, "script_fields": { "structured_payloads": { "script": { "source": "def payloadList = []; for (term in doc['content_with_payload']) { payloadList.add(['token': term.text, 'payload': term.payload]); } return payloadList;" } } } }
这个查询会返回:
- 干净的纯文本高亮结果(来自
content_plain字段的高亮) - 结构化的payload数组(在
script_fields的structured_payloads里)
3. 补充说明
如果不想新增字段,也可以在查询命中后,对每个文档单独调用_termvectors接口获取结构化payload,但这种方式需要额外请求,不如新增字段高效。
总结下来,拆分字段存储是最直接的解决方案,完全不用再从高亮结果里解析payload。
内容的提问来源于stack exchange,提问作者knpwrs
相关产品推荐
相关产品推荐

