【问题标题】:Grouping on search result - RavenDB对搜索结果进行分组 - RavenDB
【发布时间】:2013-11-10 07:39:53
【问题描述】:

我有一个显示文本搜索结果的索引。结果总是只显示一个月。

我需要显示每个月有多少结果。示例在底部。

我知道分面搜索应该可以完成这项工作,但是手动创建/生成范围是不可能的,并且会导致大量范围。 我尝试了官方文档中的所有内容,甚至 ResultTransformers 这不是正确的工具。所以我希望我一定忽略了一些东西。

Map = transactions => from transaction in transactions
select new
    {
        Description = new object[] { transaction.Description, transaction.Items.Select(i => i.Name), transaction.Documents.Select(i => i.Name) },
        Account_UserName = transaction.Account.UserName,
        Time = transaction.Time
    };

我期望的结果是这样的:

 [{
    Year: 2013,
    Month: 12,
    Count: 3
 },
 {
    Year: 2013,
    Month: 11,
    Count: 10
 }]

【问题讨论】:

    标签: c# full-text-search ravendb faceted-search


    【解决方案1】:

    您想用 Month 值标记每个索引记录并从那里开始:

    Map = transactions => from transaction in transactions
    select new
        {
            Description = new object[] { transaction.Description, transaction.Items.Select(i => i.Name), transaction.Documents.Select(i => i.Name) },
            Account_UserName = transaction.Account.UserName,
            Month = transaction.Time.Month + "/" + transaction.Time.Year, // To be able to group on Months
            Time = transaction.Time
        };
    

    从那里您可以在 Month 字段上使用 faceting,或使用 Reduce 函数将 Months 与总计索引以使该计算可搜索

    【讨论】:

    • 很抱歉,但我不明白添加月份字段对我有何帮助。我已经尝试使用以下字段映射/减少索引:Description - 我查询的字段、UserNameYearMonth , 计数。但是将 Description 设置为 null 以使结果组正确地停止索引工作。我编辑了问题以使其更清楚。
    • 因为这样您就可以使用 Month 字段作为 reduce 键。您仍然可以使用 group by new { time.Month, time.Year } 执行此操作,但我个人的偏好是将它们放在一个字段中以提高可读性。
    • 再次阅读您的评论 - 如果您想查询描述,您不能真正使用 Map/Reduce,只能使用方面。
    【解决方案2】:

    经过一番挖掘,我发现Dynamic aggregation 可以完成这项工作。我添加了字段月份,因为匿名对象不起作用。

    Map = transactions => from transaction in transactions
    select new
        {
            Value = transaction.Value,
            Description = new object[] { transaction.Description, transaction.Items.Select(i => i.Name) },
            Account_UserName = transaction.Account.UserName,
            Time = transaction.Time,
            Month = new DateTime(transaction.Time.Year, transaction.Time.Month, 1) // new field
        };
    

    然后通过.AggregateBy(x => x.Month).CountOn(x => x.Month);扩展查询

    var result = _session.Query<Transaction, Transaction_Search>()
        .AggregateBy(x => x.Month)
        .CountOn(x => x.Month);
    

    经过一些转换,这会产生预期的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 2013-05-04
      • 2012-12-01
      相关资源
      最近更新 更多