RavenDB - 索引“排序”似乎失败了

时间:2014-02-20 21:35:50

标签: c# ravendb

我试图指示RavenDB按数字字段对特定索引进行排序,该类看起来像这样;

class Level {
  public int Number {
     get;
     set;
  }

  public string Id {
    get;
    set;
  }

  // other properties not listed
}

所以我用一个简单的循环创建了15,000个文档,数字字段从1到15000逐步设置。到目前为止,这个工作正常。

现在当我查询它时,我希望它默认情况下按照数字的顺序对它们进行排序。所以我的第一次尝试就是使用标准OrderBy

var query = RavenSession
   .Query<Level>()
   .Customize(c => c.WaitForNonStaleResults())
   .OrderBy(r => r.Number)
   .ToList();

这肯定不起作用。我最终得到了一个类似于......的列表。

[levels/1]
[levels/3751]
[levels/8583]
[levels/2828]

这对我来说甚至都没有意义。所以我尝试指定一个索引。

public class Level__ByNumber : AbstractIndexCreationTask<Models.Level> {

    public Level__ByNumber() {
        Map = results => from result in results
                       select new {
                           Id = result.Id,
                           Number = result.Number
                       };

        Sort(n => n.Number, SortOptions.Int);
    }
}

然后完全按照我假设索引被调用...

  RavenQueryStatistics statistics;

    var query = RavenSession
       .Query<Level, Level_ByNumber>()
       .Customize(c => c.WaitForNonStaleResults())
       .Statistics(out statistics);

   if(searchable != null) {
       query = query.Search(n => n.Number, searchable);
   }

   var results = query.ToList();

仍然没有运气;列表以奇怪的顺序被扰乱。我也试过SortOptions.ShortSortOptions.String但没有用。我究竟做错了什么?如何使此索引只按预期顺序返回对象?

我已经彻底阅读了有关此文档的文档,其他堆栈溢出问题(例如This)和建议的信息也不起作用。

2 个答案:

答案 0 :(得分:1)

你编写的代码对我有效(你在索引名称中有一个额外的下划线,但我认为这不会影响任何事情) 请比较一下这个单元测试与你为我传递的内容有何不同之处:

[TestMethod]
public void TestMethod()
{
    using (var session = _store.OpenSession())
    {
        session.Store(new Level{ Number = 2828});
        session.Store(new Level { Number = 8583 });
        session.Store(new Level { Number = 3751 });
        session.Store(new Level{ Number = 1});
        session.SaveChanges();
        RavenQueryStatistics statistics;
        var query = session.Query<Level, Level_ByNumber>().Customize(c => c.WaitForNonStaleResults()).Statistics(out statistics).OrderBy(x => x.Number);

        var results = query.ToList();

        Assert.AreEqual(1, results[0].Number);
        Assert.AreEqual(2828, results[1].Number);
        Assert.AreEqual(3751, results[2].Number);
        Assert.AreEqual(8583, results[3].Number);//all pass
    }
}

答案 1 :(得分:0)

我相信您的问题是您正在分析数字字段。不要那样做。

Index(n => n.Number, FieldIndexing.Analyzed);

删除它,你应该没问题。

如果这不起作用,请尝试使用Store存储您的fielding,但我认为您不需要。