Elasticsearch通配符查询无结果及重索引映射问题咨询
问题解答
一、为何通配符查询无结果?
你的查询无结果主要有两个核心原因:
- text.keyword字段未被索引/存储
ignore_above:256的作用是:当整个text字段的原始内容长度超过256字符时,text.keyword字段会被直接忽略(不索引也不存储)。你只关注了查询串的长度,但实际text.keyword存储的是完整的判决书文本,如果判决书总长度超过256字符,这个子字段就不存在了,自然查不到结果。 - 对keyword字段存储逻辑的误解
text.keyword存储的是整个text字段的完整原始内容,而非其中的某个子串。你的wildcard查询*a?v. mario rossi*是在匹配整个keyword字段值中是否包含该模式。如果text字段完整内容确实包含目标子串但仍查不到,还要检查是否存在大小写差异(keyword字段默认大小写敏感)或特殊字符转义问题。
二、关于新增store:true的疑问
1. "存储text.keyword字段后即可访问并执行通配符查询"是否正确?
不正确。你新增的store:true是作用于text字段本身,和它的子字段text.keyword完全无关:
store:true控制的是是否单独存储该字段的值(默认Elasticsearch通过_source字段存储所有原始数据,不需要显式设置store:true也能正常查询)。- 若要控制
text.keyword的存储,需要在子字段配置中单独设置,示例如下:
"text": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256, "store": true // 此处才是控制text.keyword的存储 } } }
但实际上,只要text.keyword被正常索引(即text字段长度未超过256),即使不设置store:true也能执行通配符查询,因为查询时可从_source中匹配数据。
2. 如何用新映射重索引my_index?
不需要修改原索引的映射,正确步骤如下:
- 步骤1:创建新索引(例如
my_index_new),配置目标映射
PUT /my_index_new { "mappings": { "properties": { "text": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } // 若确实需要单独存储text字段,再添加"store": true } } } }
- 步骤2:使用
_reindexAPI复制原索引数据到新索引
POST /_reindex { "source": { "index": "my_index" }, "dest": { "index": "my_index_new" } }
- 步骤3:验证与切换
在新索引执行通配符查询确认结果符合预期后,可删除原索引,将新索引别名改为my_index,实现业务无感知切换。
内容的提问来源于stack exchange,提问作者Nicola Paganotti
相关产品推荐
相关产品推荐

