2016-08-13 12 views
2

Sitecore ContentSearch APIで実行されるLucene/Solrクエリを最適化しようとしています。具体的には、MultiListFieldを検索する場合です。Sitecore Lucene/Solrクエリを最適化する

環境: サイトコアの8.1u2、Solrの

私はmultilistfieldの値を照会するために、以下の方法があります。

public static Expression<Func<SearchResultItem, bool>> MultiFieldContainsExpression(IEnumerable<string> fieldNames, IEnumerable<string> ids) 
{ 
    //fieldNames = ["field_A", "field_X"] 
    //ids = [GUID_A, GUID_X] 

    Expression<Func<SearchResultItem, bool>> expression = PredicateBuilder.True<SearchResultItem>(); 
    foreach (string fieldname in fieldNames) 
    { 
     ids.ForEach(id => 
     { 
     expression = expression.Or(i => i[fieldName].Contains(IdHealper.NormalizeGuid(id, true))); 
     }); 
    } 

    return expression; 
} 

結果Luceneクエリは次のようになります。

((field_A:(*GUID_A*) OR field_A:(*GUID_X*) OR field:_X:(*GUID_A*) OR field_X:(*GUID_X*))) 

私はこのようなクエリを(または可能であればもっと良い)ようにしたい:

((field_A:(*GUID_A* OR *GUID_X*) OR (field_X:(*GUID_A* OR *GUID_X*))) 

基本的に、フィールド内の値の配列に別の配列の値が含まれているかどうかを確認する。事前にどうもありがとうございました。

答えて

0

デフォルトでSitecoreは、マルチリストフィールドを、スペースで区切られた小文字のGuid(Guid.ToString( "N"))のリストとしてインデックス付けします。関係を非正規化し、項目名または内容を項目フィールド内にComputed Fieldを使用して格納すると便利です。計算フィールドを使用すると、参照アイテムを繰り返し処理して、名前を含む単一のフィールドにすることができます。正確なGuidを知っている場合、特定の参照項目だけに結果を限定したい場合には、Guidフィールドを保持したがっておく必要があります。