Item
Lucene インデックスがタイプ A のアイテムのドキュメントを作成するときに、別のアイテム B のすべてのプロパティも含まれるように、関連ドキュメント (Sitecore 固有の Lucene ドキュメントは です) を含めようとしています。
最終的な結果は、ユーザーが項目 B で見つかったデータを検索すると、ユーザーは項目 A にヒットするということです。基本的に、Lucene ドキュメントをプログラムで「拡張」しようとしていると思います。
これまでの私のコードは次のとおりです。インデクサー クラスを拡張し、項目 B から項目 A (コンテキスト ドキュメント) にフィールドを追加するメソッドをオーバーライドしています。私web.config
のカスタムデータベースクローラークラスで特定の検索インデックスを(デバッグ速度のために)追加しました。
public class DatabaseCrawlerExtension : Sitecore.Search.Crawlers.DatabaseCrawler
{
protected override void AddAllFields(Lucene.Net.Documents.Document document, Sitecore.Data.Items.Item item, bool versionSpecific)
{
base.AddAllFields(document, item, versionSpecific);
string fieldName;
if (/* item is of template A */)
{
var targetItems = /* get items based on a property */;
foreach (var additionalIndexItem in targetItems)
{
foreach (var fieldKey in additionalIndexItem.Fields
.Select(f => f.Key)
.Where(fk => !fk.StartsWith("_")))
{
document.Add(base.CreateValueField(fieldKey, additionalIndexItem[fieldKey]));
}
}
}
}
}
このコードをデバッグしたところdocument.Add
、 を呼び出している行にヒットし、正しいデータが追加されていることがわかります。私が別の方法で試したのは、メソッドを最初または最後に呼び出すことと、代わりにbase
メソッドを使用しようとすることの間で異なります。これにより、インデックスに追加のデータは作成されませんでした。AddSpecialFields
AddAllFields
インデックスをデバッグ/確認するために、(Sitecore で) インデックスを再構築して最終結果を確認し、Lukeというツールを使用して生成されたインデックス ファイルを直接確認しました。