0

希望你能帮我 !!

我正在收集推文,这些推文具有 created_at 日期(DataPublicacao)和一些 Hashtags。每条推文都指向一个广播公司 (redeId) 和一个节目 (programaId)。我想在数据库中查询某个时期最常用的 20 个主题标签。

我必须映射每个主题标签,使用它的时间,以及它所指的广播公司和电视节目。

然后,我需要能够计算每个主题标签在特定时期内的出现次数(我不知道如何)。

public class Tweet : IModelo
{
    public string Id { get; set; }
    public string RedeId { get; set; }
    public string ProgramaId { get; set; }
    public DateTime DataPublicacao { get; set; }
    public string Conteudo { get; set; }
    public string Aplicacao { get; set; }
    public Autor Autor { get; set; }
    public Twitter.Monitor.Dominio.Modelo.TweetJson.Geo LocalizacaoGeo { get; set; }
    public Twitter.Monitor.Dominio.Modelo.TweetJson.Place Localizacao { get; set; }
    public Twitter.Monitor.Dominio.Modelo.TweetJson.Entities Entidades { get; set; }
    public string Imagem { get; set; }
    public Autor Para_Usuario { get; set; }
    public string Retweet_Para_Status_Id { get; set; }
}

“实体”是主题标签、用户说明和网址。

我尝试按广播公司、电视节目和文本对主题标签进行分组,并列出出现的日期。然后,我必须转换结果,这样我才能计算那段时间的出现次数。

    public class EntityResult
    {
        public string hashtagText { get; set; }
        public string progId { get; set; }
        public string redeId { get; set; }
        public int listCount { get; set; }
    }

    public class HashtagsIndex : AbstractIndexCreationTask<Tweet, HashtagsIndex.ReduceResults>
    {
        public class ReduceResults
        {
            public string hashtagText { get; set; }
            public DateTime createdAt { get; set; }
            public string progId { get; set; }
            public string redeId { get; set; }
            public List<DateTime> datesList { get; set; }
        }

        public HashtagsIndex()
        {
            Map = tweets => from tweet in tweets
                            from hts in tweet.Entidades.hashtags
                            where tweet.Entidades != null
                            select new
                            {
                                createdAt = tweet.DataPublicacao,
                                progId = tweet.ProgramaId,
                                redeId = tweet.RedeId,
                                hashtagText = hts.text,
                                datesList = new List<DateTime>(new DateTime[] { tweet.DataPublicacao })
                            };

            Reduce = results => from result in results
                                group result by new { result.progId, result.redeId, result.hashtagText }
                                    into g
                                    select new
                                    {
                                        createdAt = DateTime.MinValue,
                                        progId = g.Key.progId,
                                        redeId = g.Key.redeId,
                                        hashtagText = g.Key.hashtagText,
                                        datesList = g.ToList().Select(t => t.createdAt).ToList()
                                    };
        }
    }

到目前为止,我提出的查询是:

                    var hashtags2 = session.Query<dynamic, HashtagsIndex>().Customize(t => t.TransformResults((query, results) =>
                        results.Cast<dynamic>().Select(g =>
                        {
                            Expression<Func<DateTime, bool>> exp = o => o >= dtInit && o <= dtEnd;

                            int count = g.Where(exp);
                            return new EntityResult
                            {
                                redeId = g.redeId,
                                progId = g.progId,
                                hashtagText = g.hashtagText,
                                listCount = count
                            };
                        }))).Take(20).ToList();

现在我需要 OrderByDescending(t=>t.count),所以我不能 Take(20) 那个时期最常用的主题标签。

我怎么做?

4

1 回答 1

1

是否可以在 mapreduce 过程之前过滤项目?

map/reduce 索引就像任何其他索引一样。始终通过所有索引处理所有文档。所以当像你问的那样用“之前”来表达时,答案显然是“不”。

但我认为您只对在索引期间过滤项目感兴趣,这很容易在地图中完成:

Map = items => from item in items
               where item.foo == whatever  // this is how you filter
               select new
               {
                 // whatever you want to map
               }

此索引将处理所有文档,但生成的索引将仅包含与您在 where 子句中指定的过滤器匹配的项目。

是否可以随后按功能分组,例如按年龄分组用户,然后按地区分组

分组在reduce步骤中完成。这就是 map/reduce 的全部意义所在。

我给你的建议(我的意思不是不尊重)是在你尝试跑步之前先走路。构建一个简单的原型或一组单元测试,首先尝试基本的存储和检索。然后尝试基本的索引和查询。然后尝试一个简单的map reduce,例如计算所有推文。只有这样,您才应该尝试使用其他分组进行高级映射/减少。如果您遇到麻烦,那么您将获得可以在此处发布以寻求帮助的代码。

可能吗?

当然。世事皆可能。:)

于 2013-06-03T15:06:58.707 回答