Elasticsearch搜索在具有特殊字符和通配符的字段中失败

 手机用户2702933940 发布于 2022-12-07 18:17

我在Elasticsearch中有一个字段,其值为"PEI.H.02354.01.".当我用querystringas 搜索时

{  
   "query":{  
      "query_string":{  
         "query":"field:PEI.H.02354.01.",
         "default_operator":"AND"
      }
   }
}

然后返回一个结果,这是正确的行为.但是,如果我使用通配符搜索,则不会返回任何结果,例如

{  
   "query":{  
      "query_string":{  
         "query":"field:PEI.H.02354.01.*",
         "default_operator":"AND"
      }
   }
}

该字段是字符串类型并进行分析.下面是创建索引的代码,包括分析器和映射.

{
   "settings":{  
      "analysis":{  
         "analyzer":{  
            "number":{  
               "type":"custom",
               "tokenizer":"keyword",
               "filter":[  
                  "lowercase"
               ],
               "char_filter":[  
                  "number_filter"
               ]
            },
            "diacritical":{  
               "type":"custom",
               "tokenizer":"standard",
               "filter":[  
                  "standard",
                  "lowercase",
                  "asciifolding",
                  "nfd_normalizer"
               ]
            }
         },
         "filter":{  
            "nfd_normalizer":{  
               "type":"icu_normalizer",
               "name":"nfc"
            }
         },
         "char_filter":{  
            "number_filter":{  
               "type":"pattern_replace",
               "pattern":"[^\\d]+",
               "replacement":""
            }
         }
      }
   },
   "mappings":{  
      "testType":{  
         "_source":{  
            "enabled":false
         },
         "_all":{  
            "enabled":false
         },
         "_timestamp":{  
            "enabled":"true",
            "store":"yes"
         },
         "properties":{  
            "field":{  
               "store":"yes",
               "type":"string",
               "index":"analyzed",
               "analyzer":"diacritical"
            }
         }
     }    
}

最后,插入样本

{
    field: "PEI.H.02354.01."
}

有谁知道为什么会这样,以及如何解决这个问题?

1 个回答
  • 请参阅query_string文档: 默认情况下不分析通配符-它们是小写的(lowercase_expanded_terms默认为true)但不进行进一步分析 您存储的数据分为两个术语: curl-XGETlocalhost:9200/myindex/_analyze?analyzer=diacritical&pretty-dPEI.H.02354.01 { tokens:[{ token:pei.h, start_offset:0, end_offset:5, type:<ALPHANUM>, position:1 },{ token:02354.01, start_offset:6, end_offset:14, type:<NUM>, position:2 }] } 但由于您的搜索字词只带有通配符pei.h.02354.01.*,因此不匹配. 但是如果analyze_wildcard设置为true,则会获得命中: curl-XGEThttp://localhost:9200/myindex/testType/_search?pretty-d >{ >query:{ >query_string:{ >query:field:PEI.H.02354.01.*, >default_operator:AND, >analyze_wildcard:true >} >} >} { took:5, timed_out:false, _shards:{ total:5, successful:5, failed:0 }, hits:{ total:2, max_score:1.4142135,
    2022-12-11 01:55 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有