2012-01-27 54 views
0

我有多重映射/降低其是伟大的工作指标,但是我现在要上的一个字段查询......但现场是一个子对象中......多重映射/减少索引字段问题

ReduceResult 
- Name 
- Description 
- GenreObject 
    - Name 
    - Code 

我曾尝试过各种选择,但我仍然得到下面的错误:

Index(x => x.Genre.Code, FieldIndexing.Analyzed); 
Store(x => x.Genre.Code, FieldStorage.Yes); 

或 指数(X => x.Genre,FieldIndexing.Analyzed); 存储(x => x.Genre,FieldStorage.Yes);

我可以在管理控制台看到它有'Code'字段的索引,但它似乎在寻找Genre_Code。


Url: "/indexes/AudioWithCounters?query=Genre_Code%253Ahouse&start=0&pageSize=25&aggregation=None&sort=-WeeksComments" 

System.ArgumentException: The field 'Genre_Code' is not indexed, cannot query on fields that are not indexed 

我试图改变索引字段名称为“Genre_Code”手动管理控制台,但它似乎没有保存。

我知道我可以奉承我的类型对象,但是id而不是如果我能逃脱它。

任何想法?

更新 - 完整的索引:

namespace HM.Web.Infrastructure.Indexes 
{ 
    public class AudioWithCounters : AbstractMultiMapIndexCreationTask<AudioWithCounters.AudioViewModel> 
    { 
     public class AudioViewModel 
     { 
      public string Id { get; set; } 
      public string ArtistName { get; set; } 
      public string Name { get; set; } 
      public string Identifier { get; set; } 
      public string Description { get; set; } 
      public IList<Tag> Tags { get; set; } 
      public Genre Genre { get; set; } 
      public DateTimeOffset? DateAdded { get; set; } 
      public UserImage Image { get; set; } 
      public int TotalComments { get; set; } 
      public int TotalDownloads { get; set; } 
      public int TotalPlays { get; set; } 
      public int TotalLikes { get; set; } 
      public int TotalFavourites { get; set; } 
      public int WeeksComments { get; set; } 
      public int WeeksDownloads { get; set; } 
      public int WeeksPlays { get; set; } 
      public int WeeksLikes { get; set; } 
      public int WeeksFavourites { get; set; } 
     } 

     public AudioWithCounters() 
     { 
      AddMap<Audio>(audios => from audio in audios 
            select new 
            { 
             Id = audio.Id, 
             ArtistName = audio.ArtistName, 
             Name = audio.Name, 
             Identifier = audio.Identifier, 
             Description = audio.Description, 
             Tags = audio.Tags, 
             Genre = audio.Genre, 
             DateAdded = audio.DateAdded, 
             Image = audio.Image, 
             TotalDownloads = 0, 
             TotalComments = audio.CommentsCount, 
             TotalPlays = 0, 
             TotalLikes = 0, 
             TotalFavourites = 0, 
             WeeksDownloads = 0, 
             WeeksPlays = 0, 
             WeeksComments = 0, 
             WeeksLikes = 0, 
             WeeksFavourites = 0 
            }); 

      AddMap<AudioComments>(comments => from audioComment in comments 
               from comment in audioComment.Comments 
               where comment.CreatedAt >= DateTimeOffset.Now.AddDays(-7) 
            select new 
            { 
             Id = audioComment.Audio.Id, 
             ArtistName = (string)null, 
             Name = (string)null, 
             Identifier = (string)null, 
             Description = (string)null, 
             Tags = (object)null, 
             Genre = (object)null, 
             DateAdded = (object)null, 
             Image = (object)null, 
             TotalDownloads = 0, 
             TotalComments = 0, 
             TotalPlays = 0, 
             TotalLikes = 0, 
             TotalFavourites = 0, 
             WeeksDownloads = 0, 
             WeeksPlays = 0, 
             WeeksComments = 1, 
             WeeksLikes = 0, 
             WeeksFavourites = 0 
            }); 


      AddMap<AudioCounter>(counters => from counter in counters 
              where counter.Type == Core.Enums.Audio.AudioCounterType.Download 
            select new 
            { 
             Id = counter.AudioId, 
             ArtistName = (string)null, 
             Name = (string)null, 
             Identifier = (string)null, 
             Description = (string)null, 
             Tags = (object)null, 
             Genre = (object)null, 
             DateAdded = (object)null, 
             Image = (object)null, 
             TotalDownloads = 1, 
             TotalComments = 0, 
             TotalPlays = 0, 
             TotalLikes = 0, 
             TotalFavourites = 0, 
             WeeksDownloads = 0, 
             WeeksPlays = 0, 
             WeeksComments = 0, 
             WeeksLikes = 0, 
             WeeksFavourites = 0 
            }); 

      AddMap<AudioCounter>(counters => from counter in counters 
              where counter.Type == Core.Enums.Audio.AudioCounterType.Play 
              select new 
              { 
               Id = counter.AudioId, 
               ArtistName = (string)null, 
               Name = (string)null, 
               Identifier = (string)null, 
               Description = (string)null, 
               Tags = (object)null, 
               Genre = (object)null, 
               DateAdded = (object)null, 
               Image = (object)null, 
               TotalDownloads = 0, 
               TotalPlays = 1, 
               TotalComments = 0, 
               TotalLikes = 0, 
               TotalFavourites = 0, 
               WeeksDownloads = 0, 
               WeeksPlays = 0, 
               WeeksComments = 0, 
               WeeksLikes = 0, 
               WeeksFavourites = 0 
              }); 

      AddMap<AudioCounter>(counters => from counter in counters 
              where counter.Type == Core.Enums.Audio.AudioCounterType.Download 
              where counter.DateTime >= DateTimeOffset.Now.AddDays(-7) 
              select new 
              { 
               Id = counter.AudioId, 
               ArtistName = (string)null, 
               Name = (string)null, 
               Identifier = (string)null, 
               Description = (string)null, 
               Tags = (object)null, 
               Genre = (object)null, 
               DateAdded = (object)null, 
               Image = (object)null, 
               TotalDownloads = 0, 
               TotalPlays = 0, 
               TotalComments = 0, 
               TotalLikes = 0, 
               TotalFavourites = 0, 
               WeeksDownloads = 1, 
               WeeksPlays = 0, 
               WeeksComments = 0, 
               WeeksLikes = 0, 
               WeeksFavourites = 0 
              }); 

      AddMap<Like>(likes => from like in likes 
              select new 
              { 
               Id = like.AudioId, 
               ArtistName = (string)null, 
               Name = (string)null, 
               Identifier = (string)null, 
               Description = (string)null, 
               Tags = (object)null, 
               Genre = (object)null, 
               DateAdded = (object)null, 
               Image = (object)null, 
               TotalDownloads = 0, 
               TotalPlays = 0, 
               TotalComments = 0, 
               TotalLikes = 1, 
               TotalFavourites = 0, 
               WeeksDownloads = 0, 
               WeeksPlays = 0, 
               WeeksComments = 0, 
               WeeksLikes = 0, 
               WeeksFavourites = 0 
              }); 

      AddMap<Favourite>(favs => from fav in favs 
            select new 
            { 
             Id = fav.AudioId, 
             ArtistName = (string)null, 
             Name = (string)null, 
             Identifier = (string)null, 
             Description = (string)null, 
             Tags = (object)null, 
             Genre = (object)null, 
             DateAdded = (object)null, 
             Image = (object)null, 
             TotalDownloads = 0, 
             TotalPlays = 0, 
             TotalComments = 0, 
             TotalLikes = 0, 
             TotalFavourites = 1, 
             WeeksDownloads = 0, 
             WeeksPlays = 0, 
             WeeksComments = 0, 
             WeeksLikes = 0, 
             WeeksFavourites = 0 
            }); 

      AddMap<AudioCounter>(counters => from counter in counters 
              where counter.Type == Core.Enums.Audio.AudioCounterType.Play 
              where counter.DateTime >= DateTimeOffset.Now.AddDays(-7) 
              select new 
              { 
               Id = counter.AudioId, 
               ArtistName = (string)null, 
               Name = (string)null, 
               Identifier = (string)null, 
               Description = (string)null, 
               Tags = (object)null, 
               Genre = (object)null, 
               DateAdded = (object)null, 
               Image = (object)null, 
               TotalDownloads = 0, 
               TotalPlays = 0, 
               TotalComments = 0, 
               TotalLikes = 0, 
               TotalFavourites = 0, 
               WeeksDownloads = 1, 
               WeeksPlays = 0, 
               WeeksComments = 0, 
               WeeksLikes = 0, 
               WeeksFavourites = 0 
              }); 

      AddMap<Like>(likes => from like in likes 
            where like.DateCreated >= DateTimeOffset.Now.AddDays(-7) 
            select new 
            { 
             Id = like.AudioId, 
             ArtistName = (string)null, 
             Name = (string)null, 
             Identifier = (string)null, 
             Description = (string)null, 
             Tags = (object)null, 
             Genre = (object)null, 
             DateAdded = (object)null, 
             Image = (object)null, 
             TotalDownloads = 0, 
             TotalPlays = 0, 
             TotalComments = 0, 
             TotalLikes = 0, 
             TotalFavourites = 0, 
             WeeksDownloads = 0, 
             WeeksPlays = 0, 
             WeeksComments = 0, 
             WeeksLikes = 1, 
             WeeksFavourites = 0 
            }); 

      AddMap<Favourite>(favs => from fav in favs 
             where fav.DateCreated >= DateTimeOffset.Now.AddDays(-7) 
             select new 
             { 
              Id = fav.AudioId, 
              ArtistName = (string)null, 
              Name = (string)null, 
              Identifier = (string)null, 
              Description = (string)null, 
              Tags = (object)null, 
              Genre = (object)null, 
              DateAdded = (object)null, 
              Image = (object)null, 
              TotalDownloads = 0, 
              TotalPlays = 0, 
              TotalComments = 0, 
              TotalLikes = 0, 
              TotalFavourites = 0, 
              WeeksDownloads = 0, 
              WeeksPlays = 0, 
              WeeksComments = 0, 
              WeeksLikes = 0, 
              WeeksFavourites = 1 
             }); 

      Reduce = results => from result in results 
           group result by result.Id 
            into g 
            select new 
            { 
             Id = g.Key, 
             ArtistName = g.Select(x => x.ArtistName).Where(x => x != null).FirstOrDefault(), 
             Name = g.Select(x => x.Name).Where(x => x != null).FirstOrDefault(), 
             Identifier = g.Select(x => x.Identifier).Where(x => x != null).FirstOrDefault(), 
             Description = g.Select(x => x.Description).Where(x => x != null).FirstOrDefault(), 
             Tags = g.Select(x => x.Tags).Where(x => x != null).FirstOrDefault(), 
             Genre = g.Select(x => x.Genre).Where(x => x != null).FirstOrDefault(), 
             DateAdded = g.Select(x => x.DateAdded).Where(x => x != null).FirstOrDefault(), 
             Image = g.Select(x => x.Image).Where(x => x != null).FirstOrDefault(), 
             TotalDownloads = g.Sum(x => x.TotalDownloads), 
             TotalPlays = g.Sum(x => x.TotalPlays), 
             TotalComments = g.Sum(x => x.TotalComments), 
             TotalLikes = g.Sum(x => x.TotalLikes), 
             TotalFavourites = g.Sum(x => x.TotalFavourites), 
             WeeksComments = g.Sum(x => x.WeeksComments), 
             WeeksDownloads = g.Sum(x => x.WeeksDownloads), 
             WeeksPlays = g.Sum(x => x.WeeksPlays), 
             WeeksLikes = g.Sum(x => x.WeeksLikes), 
             WeeksFavourites = g.Sum(x => x.WeeksFavourites) 
            }; 

      Index(x => x.Genre.Code, FieldIndexing.Analyzed); 
      Store(x => x.Genre.Code, FieldStorage.Yes); 
     } 
    } 

} 
+0

您是否可以更新问题,使其包含您正在使用的索引,而不会很难说出问题所在。 – 2012-01-27 16:30:54

+0

更新了完整的索引代码 – 2012-01-27 18:18:36

+0

呃,这似乎是一个非常复杂的指数,你也有多个AddMap 子句为相同的类型有点奇怪。 RavenDB邮件列表可能会更好地讨论这个问题。你能在那里发表一篇关于你的文档的描述以及你正在尝试做什么。 – 2012-01-27 19:09:54

回答

1

你看到的问题是,因为Genre.Code字段不是指数。 Map/Reduce索引的输出是Reduce语句,它不包含Genre.Code字段。

Reduce = results => from result in results 
           group result by result.Id 
            into g 
            select new 
            { 
             Id = g.Key, 
             ArtistName = g.Select(x => x.ArtistName).Where(x => x != null).FirstOrDefault(), 
             Name = g.Select(x => x.Name).Where(x => x != null).FirstOrDefault(), 
             Identifier = g.Select(x => x.Identifier).Where(x => x != null).FirstOrDefault(), 
             Description = g.Select(x => x.Description).Where(x => x != null).FirstOrDefault(), 
             Tags = g.Select(x => x.Tags).Where(x => x != null).FirstOrDefault(), 
             Genre = g.Select(x => x.Genre).Where(x => x != null).FirstOrDefault(), 
             DateAdded = g.Select(x => x.DateAdded).Where(x => x != null).FirstOrDefault(), 
             Image = g.Select(x => x.Image).Where(x => x != null).FirstOrDefault(), 
             TotalDownloads = g.Sum(x => x.TotalDownloads), 
             TotalPlays = g.Sum(x => x.TotalPlays), 
             TotalComments = g.Sum(x => x.TotalComments), 
             TotalLikes = g.Sum(x => x.TotalLikes), 
             TotalFavourites = g.Sum(x => x.TotalFavourites), 
             WeeksComments = g.Sum(x => x.WeeksComments), 
             WeeksDownloads = g.Sum(x => x.WeeksDownloads), 
             WeeksPlays = g.Sum(x => x.WeeksPlays), 
             WeeksLikes = g.Sum(x => x.WeeksLikes), 
             WeeksFavourites = g.Sum(x => x.WeeksFavourites) 
            }; 

仅仅将字段设置为Stored并不能解决这个问题。

但是更大的问题是你为什么要写这样的索引,请参阅我上面的评论。