MongoDB文本搜索与排序在c#中
本文关键字:排序 文本 搜索 MongoDB | 更新日期: 2023-09-27 18:09:35
我想在MongoDB中实现文本搜索,在c#中。
文档没有涉及如何在c#中对文本搜索结果进行排序。
我有一个标签列表,以空格分隔,以匹配。
如果我提供一个像"Tag1 Tag2"这样的字符串,我希望以以下顺序提供结果:
- 任何同时包含"Tag1"answers"Tag2"的内容,后面跟着
- 任何只有'Tag1'的内容,后面跟着
- 任何只有'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的其余部分做的,而不必回到控制台风格的文本字符串,必须为每次执行解析。另外,我需要在搜索中添加更多的条件,所以这种语法对我来说不实用。
有没有我遗漏的合适的文件?如果没有,有人知道如何在顶部的风格实现这一点吗?
使用此帖子:使用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();