В настоящее время я храню набор документов в MongoDB, которые выглядят так:

{
  "_id": { "$oid": "234kjbj23b4kjbkjb23b4kj324" },
  "UserName": "John Doe",
  "Body": {
    "Text": "This is Manchester City Football Club",
    "Timestamp": { "$date": { "$numberLong": "12344532345324" } },
    "MessageId": {
      "$binary": { "base64": "Hqwej43riojr3o4iij34r==", "subType": "03" }
    }
  }
}

Я хочу использовать фильтр MongoDB, чтобы иметь возможность искать слово или фразу в поле Body.Text. Вот как сейчас выглядит мой код:

using MongoDB.Driver;
using MongoDB.Bson;

var collection = client.GetDatabase("Database").GetCollection<BsonDocument>("Collection");
var filter = Builders<BsonDocument>.Filter.Eq("Body.Text", "Manchester City");
var document = collection.Find(filter).First();

В настоящее время это ничего не возвращает, так как ищет точное совпадение, поэтому, если бы я изменил его на Builders<BsonDocument>.Filter.Eq("Body.Text", "This is Manchester City Football Club");, он вернул бы правильный документ, однако я хочу найти его, выполнив поиск слова или фразы в Body.Text поле, а не точным соответствием.

Ранее я делал это с помощью регулярного выражения следующим образом:

var regexPattern = $".*{"Manchester City"}.*";
Regex r = new Regex(regexPattern, RegexOptions.IgnoreCase);
filter &= Builders<BsonDocument>.Filter.Regex(x => x.Body.Text, r);

Однако, делая это таким образом, я получаю рекомендации по производительности, говорящие Regex queries are not able to efficiently use indexes, consider using Atlas Search.

Любая помощь будет принята с благодарностью. Заранее спасибо.

0
danfs 30 Май 2023 в 19:37

1 ответ

Все, что вам нужно, может быть достигнуто с помощью Atlas Search. После настройки вы можете искать свое слово, например:

var collection = client.GetDatabase("YourDb").GetCollection<BsonDocument>("YourCollectionName");
var searchOptions = new BsonDocument
{
    { "text", new BsonDocument
        {
            { "query", "Manchester City" },
            { "path", "Body.Text" }
        }
    }
};

var searchFilter = new BsonDocument("$search", searchOptions);
var filter = Builders<BsonDocument>.Filter.Match(searchFilter);
var document = collection.Find(filter).First();
0
AVTUNEY 30 Май 2023 в 19:46