Regex 使用排序规则和正则表达式比较mongodb中的全宽和半宽日语字符
根据和,应该可以利用Regex 使用排序规则和正则表达式比较mongodb中的全宽和半宽日语字符,regex,mongodb,encoding,collation,Regex,Mongodb,Encoding,Collation,根据和,应该可以利用排序忽略日文文本中的全宽和半宽差异 我尝试了以下方法 { locale: "ja", caseLevel:true, strength:1} 有不同的力量,但没有一个在工作 db.getCollection('mycollection') .find({"desc":/バンド/}) .collation({ locale: "ja", caseLevel:true, strength:1}) 此查询无法从以下文档获取结果 {
排序
忽略日文文本中的全宽和半宽差异
我尝试了以下方法
{ locale: "ja", caseLevel:true, strength:1}
有不同的力量,但没有一个在工作
db.getCollection('mycollection')
.find({"desc":/バンド/})
.collation({ locale: "ja", caseLevel:true, strength:1})
此查询无法从以下文档获取结果
{
"desc": "*EGRパイプバンド外れ"
}
更新 找到了MongoDB正则表达式中无法应用排序规则的原因,因此,如果我使用某些匹配来执行查询,则结果是完美的:
db.getCollection('mycollection')
.find({"desc":"*EGRパイプバンド外れ???"})
.collation({ locale: "ja", caseLevel:true, strength:1})
此查询将返回*EGRパイプバンド外れ代码>此结果
但是如果我使用regex,没有任何建议吗?没有办法让collate
与任何regexfind
逻辑一起工作,因为regex脚本将覆盖任何collate
定义,并且只使用其自身定义的逻辑,即查找任何包含半宽的字符串バンド代码>仅限
实现这一点的最简单方法是在将搜索文本发送到MongoDB客户端之前添加额外的逻辑,并将文本复制到半幅和全幅。您可以使用一些现有的工具,如
然后使用$或
,将半宽和全宽搜索参数应用到查找
条件中
db.mycollection.find({$or: [{"desc":/バンド/}, {"desc":/バンド/}]})
同一问题
是的,我已经考虑过了,这是我最后的选择,因为它无法处理混合情况,例如バンド代码>。我在ICU中看过一些关于标准化的章节,在ICU的演示中,似乎可以使用标准化来标准化字符。但我无法将其用于排序,是否可以使用?@Jarvan是的,我考虑过这个混合案例,但这是一个可怕的例子,谁会发送这样一个混合文本?我从来没见过。但不幸的是,目前还没有一个纯粹的mongo解决方案。在mongo呼叫之前你需要一些东西。。。我不认为有任何方法可以对字符进行修改,使其同时匹配半宽和全宽字符,特别是在正则表达式中。@Jarvan如果您想利用我的解决方案并涵盖混合大小写,您可以生成一个字符串数组,基本上是半宽和全宽字符的组合(如バンド代码>,バンド代码>,バンド代码>,等等)和$或都是,但我想这在mongo会很慢。@Jarvan抱歉,我希望我能给出一个完整的答案,但这真的是一个奇怪的边缘案例:(请检查我的其他答案,有一些关于日语文本的有趣答案:)