MongoDB diacriticInSensitive 搜索未按预期显示所有重音(带有变音符号的单词)行,反之亦然

Posted

技术标签:

【中文标题】MongoDB diacriticInSensitive 搜索未按预期显示所有重音(带有变音符号的单词)行,反之亦然【英文标题】:MongoDB diacriticInSensitive search not showing all accented (words with diacritic mark) rows as expected and vice-versa 【发布时间】:2017-08-25 13:52:52 【问题描述】:

我有一个具有以下结构的文档集合

uid, name

带索引

db.Collection.createIndex(name: "text")

它包含以下数据

1, iphone
2, iphóne
3, iphonë
4, iphónë

当我对iphone 进行文本搜索时 我只得到了两条记录,这是出乎意料的

actual output
--------------
1, iphone
2, iphóne

如果我搜索iphonë

db.Collection.find(  $text:  $search: "iphonë"  );

I am getting
---------------------
3, iphonë
4, iphónë

但实际上我期待以下输出

db.Collection.find(  $text:  $search: "iphone"  );
db.Collection.find(  $text:  $search: "iphónë"  );

    Expected output
    ------------------
    1, iphone
    2, iphóne
    3, iphonë
    4, iphónë

我在这里遗漏了什么吗? 如何通过搜索iphoneiphónë 获得超出预期的输出?

【问题讨论】:

【参考方案1】:

由于 mongodb 3.2text indexes 对变音符号不敏感:

在版本 3 中,文本索引不区分变音符号。那就是 索引不区分包含变音符号的字符 标记及其非标记对应物,例如 é、ê 和 e。更多的 具体来说,文本索引会去除分类为的字符 Unicode 8.0 Character Database Prop List 中的变音符号。

所以下面的查询应该可以工作:

db.Collection.find(  $text:  $search: "iphone"  );
db.Collection.find(  name:  $regex: "iphone"  );

但看起来分词 (¨) 有一个错误,即使它在 unicode 8.0 列表中被称为变音符号(JIRA 上的问题:SERVER-29918)

解决方案

mongodb 3.4 开始,您可以使用collation 来执行此类查询:

例如,要获得预期的输出,请运行以下查询:

db.Collection.find(name: "iphone").collation(locale: "en", strength: 1)

这将输出:

 "_id" : 1, "name" : "iphone" 
 "_id" : 2, "name" : "iphône" 
 "_id" : 3, "name" : "iphonë" 
 "_id" : 4, "name" : "iphônë" 

在排序规则中,strength 是要执行的比较级别

1 : 仅基本字符 2 :变音符号敏感 3 : 区分大小写 + 区分变音符号

【讨论】:

以上是关于MongoDB diacriticInSensitive 搜索未按预期显示所有重音(带有变音符号的单词)行,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章

mongodb设置有权启动

win7 安装mongodb 怎么创建mongodb.log

MongoDB——MongoDB安装+增删改查操作

MongoDB——MongoDB安装+增删改查操作

window怎么安装mongodb

java怎么导出mongodb数据