MongoDB:不区分大小写和变音 [英] MongoDB: Case insensitive and accent insensitive

查看:137
本文介绍了MongoDB:不区分大小写和变音的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找字符串"JESÚS",但仅返回具有指定字符串的文档,我需要进行搜索以忽略重音和大写字母.

I am looking for string "JESÚS" but only returns the document with the specified string, I need the search to ignore the accents and capital letters.

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

I am using C# and mongodb driver.

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

I have two documents saved in my mongodb:

_id:5d265f3129ea36365c7ca587
TRABAJADOR:"JESUS HERNANDEZ DIAZ"

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

在具有mongo驱动程序的Visual C#中:

In visual c# with mongo driver:

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",则实际输出为:

If I search for "JESÚS", actual output:

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

但是实际上我期望得到以下输出:

But actually I am expecting following output:

_id:5d265f3129ea36365c7ca587
TRABAJADOR:"JESUS HERNANDEZ DIAZ"

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

推荐答案

我建议您创建一个文本索引,并将其默认语言设置为"none",以使其对变音符号不敏感,然后按如下所示进行$ text搜索:

i recommend you create a text index with the default language set to "none" in order to make it diacritic insensitive and then doing a $text search as follows:

db.Project.createIndex(
    {
        "WORKER": "text",
        "TRABAJADOR": "text"
    },
    {
        "background": false,
        "default_language": "none"
    }
)

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

这是生成上述查询的C#代码.为了简便起见,我正在使用我的图书馆MongoDB.Entities.

here's the c# code that generated the above queries. i'm using my library MongoDB.Entities for brevity.

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();
        }
    }
}

这篇关于MongoDB:不区分大小写和变音的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆