2

ItemLucene インデックスがタイプ 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メソッドを使用しようとすることの間で異なります。これにより、インデックスに追加のデータは作成されませんでした。AddSpecialFieldsAddAllFields

インデックスをデバッグ/確認するために、(Sitecore で) インデックスを再構築して最終結果を確認し、Lukeというツールを使用して生成されたインデックス ファイルを直接確認しました。

4

3 に答える 3

1

CreateValueFieldドキュメント内にインデックス付き保存されていないフィールドを作成する便利なメソッドです(サイトコア ドキュメントごと)。. これがあなたが直面している問題だと思います。Luke は、予想されるように、インデックスからフェッチされたときにインデックスのみのフィールドを表示しません。

説明されているように、これはあなたの使用にとって正しい動作のように思えます。アイテム B の値を検索し、アイテム A の値を返したいので、アイテム B の値を検索から返す必要はありません。保存されたフィールドを表示するだけでなく、アイテム B の値に対する検索が機能するかどうかをテストしてみてください。を押してみることも"Reconstruct & Edit"できます。これにより、保存されていないフィールド値を含むドキュメントを作成できる場合があります。

もう 1 つの考えられる問題は、アイテム B から含めようとしているデータのタイプにあります CreateValueField。数値や日付などの値にインデックスを付けようとします。これらは異なる方法で処理され、テキスト値でどのように動作するかはよくわかりません。テキスト値を含めようとしている場合はCreateTextField、代わりに , を使用する必要があります。

于 2013-06-25T18:18:13.353 に答える
1

これは推測にすぎbase.CreateValueField()ませんが、 を使用する代わりに、新しいLucene.Net.Documents.Field自分で作成してドキュメントに追加してみてください。Luke を使用してインデックス内の値を表示する場合は、必ずフィールドを on に設定StoreしてくださいField.Store.YES。そうしないと、値はインデックス化されますが、インデックスには保存されません。

于 2013-06-25T17:34:57.510 に答える