MongoDB:不区分大小写和重音符号

3

我想查找字符串"JESÚS",但只返回具有指定字符串的文档,我需要忽略重音和大写字母进行搜索。

我正在使用C#和mongodb驱动程序。

我在我的mongodb中保存了两个文档:

_id:5d265f3129ea36365c7ca587
TRABAJADOR:"JESUS HERNANDEZ DIAZ"

_id:5d265f01db86a83148404711
TRABAJADOR:"JESÚS HERNÁNDEZ DÍAZ"

在使用Mongo驱动程序的Visual C#中:

var filter = Builders<BsonDocument>.Filter.Regex("TRABAJADOR", new BsonRegularExpression(string.Format(".*{0}.*", "JESÚS"), "i"));

var result = collection.Find(filter, new FindOptions() { Collation = new Collation("es", strength: CollationStrength.Primary, caseLevel:true) }).ToList();

output = JsonConvert.SerializeObject(result);
return output;


如果我搜索"JESÚS",实际输出:
_id:5d265f01db86a83148404711
TRABAJADOR:"JESÚS HERNÁNDEZ DÍAZ"

但实际上我期望的输出是:

_id:5d265f3129ea36365c7ca587
TRABAJADOR:"JESUS HERNANDEZ DIAZ"

_id:5d265f01db86a83148404711
TRABAJADOR:"JESÚS HERNÁNDEZ DÍAZ"

你期望从WORKER和TRABAJADOR中得到两个结果,但是你的筛选器只在TRABAJADOR中查找... - Sinan
2个回答

1
我建议您创建一个文本索引,并将默认语言设置为“none”,以使其对变音符号不敏感,然后按以下方式执行$ text搜索:
db.Project.createIndex(
    {
        "WORKER": "text",
        "TRABAJADOR": "text"
    },
    {
        "background": false,
        "default_language": "none"
    }
)

db.Project.find({
    "$text": {
        "$search": "jesus",
        "$caseSensitive": false
    }
})

以下是生成上述查询的C#代码。为了简洁起见,我使用了我的库MongoDB.Entities。

using MongoDB.Entities;
using System;
using System.Linq;

namespace StackOverflow
{
    public class Program
    {
        public class Project : Entity
        {
            public string WORKER { get; set; }
            public string TRABAJADOR { get; set; }
        }

        private static void Main(string[] args)
        {
            new DB("test");

            DB.Index<Project>()
              .Key(p => p.WORKER, KeyType.Text)
              .Key(p => p.TRABAJADOR, KeyType.Text)
              .Option(o => o.DefaultLanguage = "none")
              .Option(o => o.Background = false)
              .Create();

            (new[] {
                new Project { WORKER = "JESUS HERNANDEZ DIAZ"},
                new Project { TRABAJADOR = "JESÚS HERNÁNDEZ DÍAZ"}
            }).Save();

            var result = DB.SearchText<Project>("jesus");

            Console.WriteLine($"found: {result.Count()}");
            Console.Read();
        }
    }
}

1
我不确定为什么这个被踩了,但在处理带有重音字符的情况下,使用具有语言文本索引是正确的方式。 - Pete Garafano
这里有一个很好的答案:https://dev59.com/I5rga4cB1Zd3GeqPiy71#44898444 - Lorenzo

1
您需要查看两个字段才能同时获得它们: 。
 var filter = Builders<BsonDocument>.Filter;
 var query = filter.Regex("TRABAJADOR", new BsonRegularExpression(string.Format(".*{0}.*", "JESÚS"), "i")) & filter.Regex("WORKER", new BsonRegularExpression(string.Format(".*{0}.*", "JESÚS"), "i"));

将第一行替换为以下两行,并将query作为参数传递给您的查找函数。

我没有测试过它,但希望它能对您有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接