RavenDB中无法解决的事件场景?

时间:2012-08-17 17:57:21

标签: indexing lucene.net ravendb

修改即可。以下是该问题的简要说明: 我有活动

class Event { Id = 0, Dates = new DateTime[] {} }

我需要查询日期范围内的所有事件,例如(8月1日到10月20日)。结果应列出按日期排序的此范围内的uniqe事件。像这样:

Event one   2012-08-04,2012-09-06,2012-09-10
Event two   2012-10-02
etc.

我需要能够分页这个结果。就是这样。


我使用ravendb的事件有以下问题。我有一个包含日期数组的文档(代表一个事件),例如2012-08-20,2012-08-21,2012-09-14,2013-01-05等。

class Event { Dates = []; }

我有一些必须符合的标准:

  1. 我需要能够在日期范围内查询这些文档。例如,查找在8月1日到9月22日,或10月1日和10月3日之间有任何日期的所有事件。

  2. 我必须能够按日期排序查询

  3. 我必须能够分页结果。

  4. 看起来很简单吧?好吧,我有两种方法,但它们都失败了。

    创建一个包含多个from的索引​​。像这样:

    from event in docs.Events
    from date in event.Dates
    select new { Dates = date}
    

    这很有效且易于查询。但是由于跳过结果,它无法被分页(索引将包含每个事件的重复项)。排序也与分页相结合失败。

    ...............

    创建一个简单的索引

    from event in docs.Events
    select new { Dates = event.Dates }
    

    这也有效且查询简单,也可以分页。但它无法排序。我需要在查询范围内的第一个可用日期对文档进行排序。

    如果我无法解决这个问题,它可能会对我们造成破坏..我真的不想开始使用新的应用程序,除了我真的很喜欢RavenDB ..

3 个答案:

答案 0 :(得分:0)

我有一个类似的要求(重复发生的事件),附加的扭曲是日期的数量变化很大(可能从1到数百)并且可能与场地有关。

在陷入类似的僵局后,我最终将事件日期存储在EventOccurrence中:

public class EventOccurrence {   
   public string EventId {get; set;}   
   public DateTime Start {get; set;}   
   public string VenueId {get; set;} 
}

它易于查询和排序,并且在发生时使用Session.Include,我们仍然保留查询性能。

这似乎是对关系模型的回归,但鉴于我们的约束,它是正确的选择。

答案 1 :(得分:0)

你是说“简单索引”的方法除了排序以外有效吗?

from event in docs.Events
select new
{
  Dates = event.Dates,
  FirstDate = event.Dates.First()
}

然后你可以对FirstDate进行排序。您无法对已分析或标记化的字段进行排序。

答案 2 :(得分:0)

我的最终解决方案是创建两个索引。我们在应用程序中无论如何都需要这两个索引,所以它不是任何开销。

以下索引用于查询和分页。 Take()和Skip()适用于这个:

from event in docs.Events
from date in event.Dates
select new { Date = date}

但是,上述索引不会返回正确的总命中数,这是创建寻呼机所需的。所以我们创建另一个索引:

from event in docs.Events
select new { Date = event.Dates }

现在我们可以使用Statistics()和Take(0)来运行完全相同的查询(注意两个索引上的Date字段具有相同的名称),只获得命中数。

显然,你需要运行两个查询,但我还没有找到解决办法。