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

vik*_*are 4 search diacritics text-search mongodb accent-insensitive

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

uid, name
Run Code Online (Sandbox Code Playgroud)

有索引

db.Collection.createIndex({name: "text"})
Run Code Online (Sandbox Code Playgroud)

它包含以下数据

1, iphone
2, iphóne
3, iphonë
4, iphónë
Run Code Online (Sandbox Code Playgroud)

当我正在进行文本搜索时,iphone 我只获得了两条记录,这是意料之外的

actual output
--------------
1, iphone
2, iphóne
Run Code Online (Sandbox Code Playgroud)

如果我搜索 iphonë

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

I am getting
---------------------
3, iphonë
4, iphónë
Run Code Online (Sandbox Code Playgroud)

但实际上我期待以下输出

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ë
Run Code Online (Sandbox Code Playgroud)

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

fel*_*lix 7

mongodb 3.2开始,文本索引是变音符号不敏感的:

对于版本3,文本索引是变音符号不敏感的.也就是说,索引不区分包含变音符号的字符和它们的非标记对应字符,例如é,ê和e.更具体地说,文本索引在Unicode 8.0字符数据库支持列表中剥离分类为变音符号的字符.

所以以下查询应该有效:

db.Collection.find( { $text: { $search: "iphone"} } );
db.Collection.find( { name: { $regex: "iphone"} } );
Run Code Online (Sandbox Code Playgroud)

但看起来像dieresis(¨)有一个错误,即使它在unicode 8.0列表中被称为变音符号(在JIRA上发布:SERVER-29918)

mongodb 3.4你可以使用collat​​ion,它允许你执行这种查询:

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

db.Collection.find({name: "iphone"}).collation({locale: "en", strength: 1})
Run Code Online (Sandbox Code Playgroud)

这将输出:

{ "_id" : 1, "name" : "iphone" }
{ "_id" : 2, "name" : "iphône" }
{ "_id" : 3, "name" : "iphonë" }
{ "_id" : 4, "name" : "iphônë" }
Run Code Online (Sandbox Code Playgroud)

在整理中,strength是执行的比较级别

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