Elasticsearch v6在R中高亮查询含term_vector参数报错的解决咨询
解决Elasticsearch v6中高亮查询
term_vector参数报错的问题 这个报错的原因很明确——在Elasticsearch 6.x版本里,term_vector是字段映射层面的配置项,根本不属于查询时highlight.fields的可配置参数,你把它放在高亮字段设置里,ES自然会解析失败。
下面是具体的解决步骤:
1. 确保目标字段的映射已配置term_vector
首先你需要确认要高亮的字段(也就是curr_search_field对应的字段)在索引映射中已经设置了term_vector: "with_positions_offsets"。如果还没设置,得先更新映射:
用R语言的httr包发送PUT请求修改映射(替换成你的ES地址、索引名、字段名):
library(httr) # 替换成你的实际信息 es_host <- "http://your-es-server:9200" index_name <- "your-index" target_field <- "your-search-field" # 对应curr_search_field response <- PUT( url = paste0(es_host, "/", index_name, "/_mapping/_doc"), # ES6默认类型是_doc,根据你的实际类型调整 body = list( properties = list( !!target_field := list( type = "text", # 字段类型,高亮一般用text类型,根据实际情况调整 term_vector = "with_positions_offsets" ) ) ), encode = "json" ) # 检查响应是否成功 content(response)
⚠️ 注意:如果这个字段已经存在且之前没有设置term_vector,修改映射后需要重新索引已有数据,因为旧数据不会自动生成term vector,只有新写入的数据才会生效。
2. 修改查询请求体,移除高亮配置中的term_vector参数
把原来请求体里highlight.fields下的"term_vector" : "with_positions_offsets"删掉即可,修改后的请求体结构如下:
{ "stored_fields": ["CONTENT.LENGTH"], "_source": ["DOC_ID", "DELIVERY_ID", "SRC_SYSTEM", "CONVERS_ID", "CONTRIB_ID", "CONTRIB_TYPE", "PRTCPNT_ID", "CONTRIB_TS", "LANG", "SYS_NOT", "SURVEIL"], "query": { "bool": { "must": [ /* 这里放body_search的内容 */ ], "filter": [ /* 这里放body_filter的内容 */ ] } }, "highlight": { "pre_tags" : ["<mark>"], "post_tags" : ["</mark>"], "fields" : { "your-search-field": {"fragment_size" : 200} } } }
补充说明
在ES6中,当字段映射里配置了term_vector: "with_positions_offsets",ES会自动利用这个term vector来优化高亮的性能和效果,完全不需要在查询时额外指定这个参数。你之前的错误就是把映射配置和查询配置搞混了~
内容的提问来源于stack exchange,提问作者Jensxy
相关产品推荐
相关产品推荐

