Elasticsearch动态模板copy_to生成的content_text字段无法高亮问题
问题根本原因
copy_to参数只会将字段值复制到ES的倒排索引中用于查询,不会将聚合后的content_text写入原始的_source文档。而ES默认高亮逻辑需要从_source中读取对应字段的内容生成高亮片段,找不到content_text的原始内容就不会返回高亮结果。
解决方案
修改索引mapping,给content_text字段开启单独存储配置,同时调整搜索请求参数读取存储的字段即可。
第一步:修改后的完整索引配置
DELETE /test PUT /test?include_type_name=true { "settings": {"number_of_shards": 1,"number_of_replicas": 1}, "mappings": { "_doc": { "dynamic_templates": [ { "full_name": { "match_mapping_type": "string", "path_match": "content.*", "mapping": { "type": "text", "copy_to": "content_text" } } } ], "properties": { "content_text": { "type": "text", "store": true // 新增:开启字段单独存储 }, "content": { "type": "object", "enabled": "true" } } } } }
第二步:修改后的搜索请求
需要在请求中指定读取单独存储的content_text字段,同时高亮配置保持不变即可:
GET /test/_search { "stored_fields": ["content_text"], // 新增:指定返回单独存储的字段 "query": { "match": { "content_text": "42" } }, "highlight": { "fields": { "content_text": {} } } }
预期返回结果
调整后返回的命中结果中会同时出现存储的content_text字段值,以及对应的高亮片段:
{ ... "hits" : { "total" : 1, "max_score" : 0.2876821, "hits" : [ { "_index" : "test", "_type" : "_doc", "_id" : "1", "_score" : 0.2876821, "fields" : { "content_text" : ["42"] }, "highlight" : { "content_text" : ["<em>42</em>"] }, "_source" : { "content" : { "a" : { "b" : { "text" : "42" } } } } } ] } }
替代方案(无需修改mapping)
如果不想调整索引配置,也可以直接修改高亮规则,直接对content下的所有字段做高亮,只要匹配了content_text的查询结果也会命中原始字段返回高亮:
GET /test/_search { "query": { "match": { "content_text": "42" } }, "highlight": { "fields": { "content.*": {} }, "require_field_match": false } }
内容的提问来源于stack exchange,提问作者michaelsnowden
相关产品推荐
相关产品推荐

