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ë
我在这里遗漏了什么吗?
如何通过搜索iphone
或iphónë
获得超出预期的输出?
【问题讨论】:
【参考方案1】:由于 mongodb 3.2,text 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
是要执行的比较级别
【讨论】:
以上是关于MongoDB diacriticInSensitive 搜索未按预期显示所有重音(带有变音符号的单词)行,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章