Elasticsearch PHP客户端匹配字母数字字符的正则问题
问题原因与解决方案
你的问题核心在于**partner_id字段的分词处理**:该字段大概率被配置了自动转小写的分词器(比如ES默认的standard分词器,或专门的lowercase分词器),导致存入ES的partner_id值全部是小写形式。当你用包含大写字母的正则.*23PR.*查询时,自然匹配不到已经被转成小写的存储值,换成小写正则.*23pr.*就能正常匹配。
可行的解决方式
方式1:直接使用小写正则查询
这是最快捷的临时解决方案,就是你已经验证有效的写法:
$this->client->search( [ 'index' => 'partners', 'body' => [ 'query' => [ 'regexp' => [ 'partner_id' => '.*23pr.*' ] ] ] ] );
方式2:修改字段映射,保留原始大小写
如果需要长期支持大小写不敏感的正则查询,或者要保留partner_id的原始大小写格式,可以将字段类型改为keyword(不分词,完全保留原始值),或者自定义分词器关闭小写转换。
修改字段映射的示例(需要重新导入数据生效):
PUT /partners/_mapping { "properties": { "partner_id": { "type": "keyword" } } }
修改后,无论用.*23PR.*还是.*23pr.*,都能匹配到对应原始大小写的partner_id值。
为什么partner_name的正则查询正常?
大概率是partner_name存储的内容本身就是小写,或者你的查询正则.*adi.*刚好和存储的小写值匹配;也有可能该字段的映射配置与partner_id不同(比如已经是keyword类型),因此正则查询能正常生效。
内容的提问来源于stack exchange,提问作者Aditya Dixit
相关产品推荐
相关产品推荐

