まず、私の英語で申し訳ありません。私の問題を非常に簡単に伝えることができれば、とても幸せです。
マルチマップ インデックスとライブ プロジェクションの問題を解決するために多くの時間を費やしています。私はstackoverflow、google、ayendeブログなどを読みすぎました...しかし、私の問題を解決できませんでした。
私が欲しいもの: 私はアプリを持っていて、ツイートのコンテンツ、ユーザー名、ハッシュタグなどの複数のソースからのTwitter検索ボックス検索であるTwitterのような検索が必要です. 結果を取得している間、結果に変換を適用し、インデックスの結果を FullSearchResult モデルに適用したいと考えています。また、結果が見つかった場所を見つけたいです。投稿、ユーザー、またはタグで?
問題: 3 種類のドキュメント (投稿、ユーザー、タグ) とマルチマップ インデックスがあります。TransformResults を使用してマルチマップ インデックスを作成すると、すべての結果が null 値で取得されます。(全文検索でマルチマップ インデックスを使用してドキュメントをクエリします)。
マイ ドキュメント
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 つの結果が得られます。ただし、すべての値は null です
query = "Tag50";
session.Query<FullSearchResult, FullSearchIndex>()
.Search(resultItem => resultItem.SearchQuery, query)
.As<FullSearchResultViewModel>()
.ToList();