11

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

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ë

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

4

1 回答 1

21

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

在版本 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开始,您可以使用排序规则来执行这种查询:

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

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:区分大小写+区分变音符号
于 2017-03-31T10:37:11.703 回答