MongoDB文本搜索与排序在c#中

本文关键字:排序 文本 搜索 MongoDB | 更新日期: 2023-09-27 18:09:35

我想在MongoDB中实现文本搜索,在c#中。

文档没有涉及如何在c#中对文本搜索结果进行排序。

我有一个标签列表,以空格分隔,以匹配。
如果我提供一个像"Tag1 Tag2"这样的字符串,我希望以以下顺序提供结果:

  1. 任何同时包含"Tag1"answers"Tag2"的内容,后面跟着
  2. 任何只有'Tag1'的内容,后面跟着
  3. 任何只有'Tag2'的

我一直在尝试拼凑一些代码:

var F = Builders<MongoPost>.Filter.Text(Tags);
var S = Builders<MongoPost>.Sort.MetaTextScore("textScore");
return Mongo.Driver.Find(F).Sort(S).ToListAsync().Result;

但是我得到以下错误:

{"QueryFailure标志为真(响应为{'"$err'": '"不能规范化查询:BadValue必须对所有$meta排序键具有$meta投影'",'"code'": 17287})。"}

此错误没有适当的文档…

然后我在这个网站上发现了以下代码:

var pipeline = new List<BsonDocument>
{
    BsonSerializer.Deserialize<BsonDocument>("{ $match: { $text: { $search: '"" + Tags + "'" } } }"),
    BsonSerializer.Deserialize<BsonDocument>("{ $sort: { score: { $meta: '"textScore'" } } }")
};
var R = Mongo.Driver.AggregateAsync(new BsonDocumentStagePipelineDefinition<MongoPost, MongoPost>(pipeline)).Result;
return R.ToListAsync().Result;

至少是运行没有错误,但我试图使代码的风格在顶部,就像你可以为API的其余部分做的,而不必回到控制台风格的文本字符串,必须为每次执行解析。另外,我需要在搜索中添加更多的条件,所以这种语法对我来说不实用。

有没有我遗漏的合适的文件?如果没有,有人知道如何在顶部的风格实现这一点吗?

MongoDB文本搜索与排序在c#中

使用此帖子:使用c#驱动程序从MongoDB集合的文本查询中检索相关排序结果


我用下面的代码让它工作:
var F = Builders<MongoPost>.Filter.Text(Tags);
var P = Builders<MongoPost>.Projection.MetaTextScore("TextMatchScore");
var S = Builders<MongoPost>.Sort.MetaTextScore("TextMatchScore");
return Mongo.Driver.Find(F).Project<MongoPost>(P).Sort(S).ToListAsync().Result;

我的类MongoPost有以下字段:

[BsonIgnoreIfNull]
public double? TextMatchScore { get; set; }

或者你可以添加convention pack来忽略所有模型的额外元素,或者只针对这个特定的模型,然后你就不需要添加额外的属性:

ConventionRegistry.Register("conventions", new ConventionPack
{
    new IgnoreExtraElementsConvention(true)
}, type => true));

然后管道如下所示:

var sortedResult = await collection
    .Find(Builders<Model>.Filter.Text(searchTerm))
    .Project<Model>(Builders<Model>.Projection.MetaTextScore("score"))
    .Sort(Builders<Model>.Sort.MetaTextScore("score"))
    .ToListAsync();