Множественный поиск по ключевым словам в MongoDB с использованием c #? - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь создать запрос mongodb в c #, который позволит мне искать в одном поле несколько ключевых слов.Я могу найти ответы только для одного ключевого слова.Я использую MongoDB.Driver v2.6.1

Моя модель:

  public class RBpartsImages
    {
        [BsonId]
        public ObjectId ID { get; set; }
        public String PartNum { get; set; }
        public string Name { get; set; }
        public String ImageFilename { get; set; }
        public ImgSize ImageSize { get; set; }
    }

Это работает, но только с одним ключевым словом:

        String keywords = "beam thin"; // produces no results, 
        // String keywords="beam"; // gives results
        var filter = Builders<RBpartsImages>.Filter.Regex("Name", new BsonRegularExpression(keywords, @"(?i)[^\s,;]+"));
        List<RBpartsImages> query = imagesCollection.Find(filter).ToList();

        Debug.WriteLine(String.Format("GetRBparts: {0}", query.ToJson(new JsonWriterSettings { Indent = true })));
        // the output is paged
        rbParts = query.Skip(page * pageSize).Take(pageSize).ToList();

, и это дает«Неподдерживаемый фильтр: Любой (ошибка значения):

    String keywords = "beam thin";
    List<String> kWords = Regex.Split(keywords, @"[\s,;]+").ToList();
    Debug.WriteLine(String.Format("GetRBparts: {0}", kWords.ToJson(new JsonWriterSettings { Indent = true })));
    List<RBpartsImages> query = (from rbi in imagesCollection.AsQueryable()
                 where (kWords.Any(r => rbi.Name.ToLower().Contains(r)))
                 select rbi).ToList();

Я ищу способ фильтрации возвращаемого списка по ключевым словам, любая помощь будет высоко оценена, спасибо.

1 Ответ

0 голосов
/ 08 июня 2018

Я только что подтвердил, что у нас был модульный тест, который делает это.Вот фрагмент кода:

var filterList = new List<string>{"TEST","test","12345"};
Func<TestDataModel, bool> wherePredicate = 
               (data) => filterList.Any(f => data.Detail.Contains(f));
var results = collection.AsQueryable().Where(wherePredicate).ToList();

Чтобы использовать фильтр регулярных выражений (в соответствии с вашей первой попыткой), вы захотите внести некоторые незначительные изменения:

string keywords = "beam thin";
var regex = $"(.*{keywords.Replace(" ", ".*)|(.*")})";
var filter = Builders<RBpartsImages>.Filter.Regex("Name", new BsonRegularExpression(regex));
List<RBpartsImages> query = imagesCollection.Find(filter).ToList();
...

Проблема заключалась в том, чточто при создании модели BsonRegularExpression вы передавали список ключевых слов плюс выражение, когда оно на самом деле принимает выражение плюс параметры (такие как поиск без учета регистра и т. д.).Управляя строкой ключевых слов в правильной строке регулярного выражения, вы получите ожидаемые результаты.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...