我试图在C#中使用MongoDB实现文本搜索。
文档没有涵盖有关如何在C#中对文本搜索结果进行排序的任何内容。
我有一个标签列表,用空格分隔,以便匹配 如果我提供类似" 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;
但是我收到以下错误:
{&#34; QueryFailure标志为真(响应为{\&#34; $ err \&#34;:\&#34;无法规范化查询:BadValue必须为所有人提供$ meta投影$ meta sort keys \&#34;,\&#34; code \&#34;:17287})。&#34;}
没有关于此错误的正确文档......
然后我在这个网站上找到了以下代码:
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的其余部分做的那样,而不必回到必须的控制台样式文本字符串每次执行都要解析。 另外,我需要为搜索添加更多标准,因此这种语法对我来说不实用。
我错过了哪些适当的文件?如果没有,有人知道如何在顶部的风格中实现这个吗?
答案 0 :(得分:7)
使用这篇文章:Retrieve Relevance Ordered Result from Text Query on MongoDB Collection using the C# Driver
我使用以下代码:
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; }
答案 1 :(得分:1)
看起来解决方案在模型上没有附加字段的情况下工作。因此,不需要解决方法来避免将这些分数存储在数据库中。适用于我的解决方案:
var filter = Builders<Model>.Filter.Text(searchTerm);
var projection = Builders<Model>.Projection.MetaTextScore("score");
var sort = Builders<Model>.Sort.MetaTextScore("score");
var sortedResult = await mongoCollection
.Find(filter)
.Project<Model>(projection )
.Sort(sort)
.ToListAsync();
我的模型中没有任何score
属性。可能是因为他们在最初的答案后改变了一些实现。我是Mongo的新手,但我认为该投影仅适用于服务器,不会影响客户端模型。