ElasticSearch Keyword字段Wildcard查询无结果原因问询
问题原因分析:Wildcard查询keyword字段无结果
假设字段myfield为keyword类型,存储值是/something/other/123,执行以下Wildcard查询却无返回结果:
GET /_search { "query": { "wildcard": {"myfield": {"value": "*123"}} } }
查不到结果的核心原因无非这几点,按排查优先级排序:
- 字段名或路径写错了:这是最常见的坑。比如实际字段叫
my_field不是myfield,或者字段嵌套在对象里,得写成obj.myfield这种路径格式。 - 存储的字段值和预期不符:比如字段值末尾藏了空格、换行符,或者输入时不小心带了特殊字符,导致实际存储的不是纯
/something/other/123,自然匹配不上*123。 - 文档未完成索引刷新:刚插入的文档默认不会立刻被索引,得等默认1秒的刷新间隔,或者手动执行
POST /_refresh刷新索引后再查询。 - 字段索引设置异常:比如字段被设为
index: false(未创建倒排索引),或者ignore_above阈值太小,导致字符串被截断,存进去的不是完整内容;如果字段配置了normalizer做归一化处理,也可能导致存储值和查询串不匹配。 - 查询语法兼容问题:部分旧版本Elasticsearch不支持
{"value": "*123"}这种完整格式,换成简写的{"wildcard": {"myfield": "*123"}}试试。
额外提醒:*123这种后缀通配符性能很差,因为Elasticsearch的倒排索引是做前缀优化的,后缀匹配需要遍历大量词条。如果经常需要按路径最后一段查询,建议提前把123单独存为一个字段,或者用path_hierarchy分词器处理路径字段。
内容的提问来源于stack exchange,提问作者Jiew Meng
相关产品推荐
相关产品推荐

