【问题标题】:Ravendb Live projections produces null values (Ravendb Lucene, Multimap, Live projections)Ravendb 实时投影产生空值(Ravendb Lucene、Multimap、实时投影)
【发布时间】:2012-10-30 01:08:12
【问题描述】:

首先,对不起我的英语,如果我能非常简单地告诉我我的问题,我会很高兴的。

我花了很多时间来解决多地图索引和实时投影问题。我在 stackoverflow、google、ayende 博客等上读了太多……但是无法解决我的问题。

我想要什么: 我有一个应用程序,想要一个类似推特的搜索,它是推特搜索框从多个来源搜索,例如来自推特内容、用户名和主题标签。当我得到结果时,我想将结果和形状索引结果的转换应用到 FullSearchResult 模型中。我也想找到找到结果的地方。在帖子中,在用户中还是在标签中?

问题: 我有 3 种类型的文档(帖子、用户、标签)和多地图索引。当我使用 TransformResults 创建我的多图索引时,我得到的所有结果都是空值。 (我通过全文搜索使用多图索引查询我的文档)。

我的文档

public class Post
{
    public string Id { get; set; }

    public long SqlDbId { get; set; }

    public string Title { get; set; }

    public string Content { get; set; }

    public string ContentAsHtml { get; set; }

    public Status Status { get; set; }

    public DenormalizedUser User { get; set; }

    public DenormalizedTagCollection Tags { get; set; }
}

public class User
{
    public string Id { get; set; }

    public string Name { get; set; }

    public string Surname { get; set; }

    public string Email { get; set; }

    public string MobileNumber { get; set; }
}

public class Tag
{
    public string Id { get; set; }

    public long SqlDbId { get; set; }

    public string TagName { get; set; }

    public DenormalizedUser TagInserterDenormalizedUser { get; set; }

    public bool IsSystemTag { get; set; }

    public Status Status { get; set; }
}

public class FullSearchIndex : AbstractMultiMapIndexCreationTask<FullSearchResult>
{
    public FullSearchIndex()
    {
        AddMap<Post>(posts => from post in posts
                              let tags = post.Tags
                              where post.Status == Status.Active
                              select new
                              {
                                  UserId = post.User != null ? post.User.Id.ToString() : (string)null,
                                  PostId = post.Id,
                                  TagIds = tags != null ? tags.Select(tag => tag.Id).ToArray() : new string[0],
                                  SearchQuery = new object[] 
                                  {                                      
                                      post.Title,
                                      post.Content,
                                      post.Tags != null ? tags.Select(x => x.TagName).ToArray() : new string[0]
                                  },
                                  Source = SearchResultSource.ResultIsFromPost
                              });

        AddMap<User>(users => from user in users
                              select new
                              {
                                  UserId = user.Id,
                                  PostId = (string)null,
                                  TagIds = new string[0],
                                  SearchQuery = new object[] 
                                  {                                      
                                      user.Name,
                                      user.Surname
                                  },
                                  Source = SearchResultSource.ResultIsFromUser
                              });

        AddMap<Tag>(tags => from tag in tags
                            where tag.Status == Status.Active
                            select new
                            {
                                UserId = (string)null,
                                PostId = (string)null,
                                TagIds = new string[] { tag.Id },
                                SearchQuery = new object[] 
                                {
                                    tag.TagName
                                },
                                Source = SearchResultSource.ResultIsFromTag
                            });

        Index(searchResult => searchResult.SearchQuery, FieldIndexing.Analyzed);

        TransformResults = (clientSideDatabase, results) =>
                                from result in results
                                let post = clientSideDatabase.Load<Post>(result.PostId)
                                let tags = clientSideDatabase.Load<Tag>(result.TagIds)
                                let user = clientSideDatabase.Load<User>(result.UserId)
                                select new
                                {
                                    PostId = post != null ? post.Id : (string)null,
                                    PostTitle = post != null ? post.Title : (string)null,
                                    PostContent = post != null ? post.Content : (string)null,
                                    PostTags = tags != null ? tags.Select(x => x.TagName).ToArray() : (string[])null,

                                    UserId = user != null ? user.Id : (string)null,
                                    UserName = user != null ? user.Name : (string)null,
                                    UserSurname = user != null ? user.Surname : (string)null,
                                    UserEmail = user != null ? user.Email : (string)null,
                                    UserMobileNumber = user != null ? user.MobileNumber : (string)null
                                };
    }
}

当我使用多图索引和 lucene 搜索进行查询时,我有 4 个结果。但是,所有的值都是空的

query = "Tag50";
session.Query<FullSearchResult, FullSearchIndex>()
                        .Search(resultItem => resultItem.SearchQuery, query)
                        .As<FullSearchResultViewModel>()
                        .ToList();

【问题讨论】:

  • 另外,我看到我的索引结果在 ravend studio 中按我想要的方式投影(FullSearchResultViewModel),其值全部为空

标签: lucene ravendb multimap


【解决方案1】:

恩卡亚, 您假设 TransformResults 的输入是 Maps 的输出,但事实并非如此。 TransformResults 的输入是实际的文档。地图的输出用于生成用于搜索的索引,而不是用于塑造转换结果的输入。

【讨论】:

  • 因为我使用 AbstractMultiMapIndexCreationTask 泛型类型,所以我的转换函数接受 IEnumerable 类型。我应该更改地图功能的输出吗?如果地图功能的输出发生变化,我该如何实现我的目标? (从不同类型的文档中查找结果并检测来自的任何结果)。实际上,我试图做与此视频“复杂搜索 - RavenDB 的单身派对!”中相同的想法。在链接youtube.com/watch?feature=player_profilepage&v=B9WWg6uDMDs。在这个地图函数的视频输出形状中,变换的输入是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2015-12-25
  • 2015-02-06
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多