使用C#

时间:2015-08-25 01:53:46

标签: c# mongodb sorting

我试图在C#中使用MongoDB实现文本搜索。

文档没有涵盖有关如何在C#中对文本搜索结果进行排序的任何内容。

我有一个标签列表,用空格分隔,以便匹配 如果我提供类似" Tag1 Tag2"的字符串,我希望按以下顺序提供结果:

  1. 任何有两个' Tag1' AND' Tag2',然后是
  2. 任何只有' Tag1',后跟
  3. 的内容
  4. 任何只有' Tag2'
  5. 的东西

    我一直试图拼凑一些代码:

    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的其余部分做的那样,而不必回到必须的控制台样式文本字符串每次执行都要解析。 另外,我需要为搜索添加更多标准,因此这种语法对我来说不实用。

    我错过了哪些适当的文件?如果没有,有人知道如何在顶部的风格中实现这个吗?

2 个答案:

答案 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的新手,但我认为该投影仅适用于服务器,不会影响客户端模型。