Elasticsearch查询未返回指定position字段的问题求助
遇到这种position字段明明配置了映射却在查询结果中缺失的情况,我帮你梳理几个最常见的排查方向和解决办法:
检查字段映射的
_source包含设置
首先确认你的position字段在映射里是否被配置为不包含在_source中。有些时候为了节省存储空间,会把某些字段设置为include_in_source: false,或者直接把字段的enabled设为false(这种情况字段只会被索引,但不会存入_source)。
你可以用这个命令查看字段的具体映射:GET /your_index_name/_mapping找到
position字段的配置,如果看到类似下面的内容:"position": { "type": "text", "include_in_source": false }那问题就出在这里了。因为
include_in_source一旦设置为false,即使你在查询的_source里指定该字段,也无法从_source中获取。解决方法是创建一个新的索引,将position字段的include_in_source设为true,然后通过_reindex把数据迁移过去。确认字段名是否完全匹配
Elasticsearch对字段名是大小写敏感的,有时候可能是字段名的大小写或者拼写问题,比如实际字段名是Position(首字母大写),但你查询里写的是position,这时候自然拿不到数据。你可以直接查询一条已知包含该字段的文档,确认字段名:GET /your_index_name/_doc/your_document_id查看返回的
_source里是否有正确的position字段。检查索引全局的
_source排除规则
有些索引在创建时全局配置了_source的排除字段,比如:"settings": { "_source": { "excludes": ["position"] } }这种全局排除的优先级比查询时的
_source包含更高,所以即使你在查询里指定要获取position,也会被过滤掉。解决方法同样是创建新索引,去掉全局的排除规则,然后迁移数据。尝试用
fields参数替代_source
如果position字段确实已经被索引,但因为各种原因没有存在_source里,你可以尝试用fields参数来获取该字段的值,而不是依赖_source。修改你的查询语句:{ "fields": ["details.*", "position"], "query": { "bool": { "should": [ {"regexp": {"name": "your_pattern_here"}}, {"fuzzy": {"name": {"value": "your_keywords_here", "fuzziness": 3}}} ], "minimum_should_match": 1 } }, "from": 0, "size": 10 }fields会从索引的倒排索引中提取字段值,只要字段是可索引的,就能获取到。验证写入的数据是否真的包含
position
最后,确认你写入的文档里确实包含position字段。有时候可能是数据写入时的错误,比如客户端代码里漏传了这个字段,或者字段名写错了。你可以用不带_source过滤的查询,看看完整的_source里是否有position:GET /your_index_name/_search { "query": { "bool": { "should": [ {"regexp": {"name": "your_pattern_here"}}, {"fuzzy": {"name": {"value": "your_keywords_here", "fuzziness": 3}}} ], "minimum_should_match": 1 } } }
内容的提问来源于stack exchange,提问作者Kousika Ganesan

