MongoDB: без учета регистра и с акцентом - PullRequest
1 голос
/ 11 июля 2019

Я ищу строку "JESÚS", но возвращает только документ с указанной строкой, мне нужен поиск, чтобы игнорировать ударения и заглавные буквы.

Я использую C # и драйвер mongodb.

У меня в mongodb сохранено два документа:

_id:5d265f3129ea36365c7ca587
TRABAJADOR:"JESUS HERNANDEZ DIAZ"

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

В визуальном 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"

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Я рекомендую вам создать текстовый индекс с языком по умолчанию, равным «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();
        }
    }
}
0 голосов
/ 12 июля 2019

Вам нужно взглянуть на два поля, чтобы получить оба:

 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"));

Замените вашу первую строку этими двумя и передайте запрос своей находке.

Iне проверял, надеюсь, у тебя это работает!

...