まあ、これは難しいものです。それを正しく行うには、2つのレベルの削減が必要になります。1つは結果を展開するタグによるもので、もう1つは折りたたむためのIDによるものです。レイヴンにはこれを行う簡単な方法がありません。
トランスフォームを使用して、それを偽造することができます。唯一の問題は、結果セットの項目をスキップすることです。そのため、それらの処理方法を知っていることを確認してください。
public class TestIndex : AbstractMultiMapIndexCreationTask<TestIndex.Result>
{
public class Result
{
public string[] Ids { get; set; }
public string Name { get; set; }
public string Tag { get; set; }
}
public TestIndex()
{
AddMap<EntityA>(entities => from a in entities
from tag in a.Tags.DefaultIfEmpty("_")
select new
{
Ids = new[] { a.Id },
Name = (string) null,
Tag = tag
});
AddMap<EntityB>(entities => from b in entities
from tag in b.Tags
select new
{
Ids = new string[0],
b.Name,
Tag = tag
});
Reduce = results => from result in results
group result by result.Tag
into g
select new
{
Ids = g.SelectMany(x => x.Ids),
g.First(x => x.Name != null).Name,
Tag = g.Key
};
TransformResults = (database, results) =>
results.SelectMany(x => x.Ids)
.Distinct()
.Select(x => database.Load<EntityA>(x));
}
}
こちらの完全な単体テストも参照してください。
別のアプローチがありますが、私はまだそれをテストしていません。これは、インデックス付きプロパティバンドルを使用して最初のパスを実行し、次にそれらの結果を2番目のパスにマップすることです。私はこれを一般的に実験しており、うまくいったら、この回答を結果で更新します。