1

コンテンツ エディターがアイテム プロパティを定義して検索し、これらのフィールドに対して個別にブースト値を設定できるようにする Sitecore 検索の実装を作成しようとしています。

これを行うには、次のように Expression Tree を使用して述語を作成します。

foreach (KeyValuePair<string, float> searchResultProperty in searchResultProperties)
{
    Expression constant = Expression.Constant(term);
    ParameterExpression parameter = Expression.Parameter(typeof(FAQSearchResultItem), "s");
    Expression property = Expression.Property(parameter, typeof(FAQSearchResultItem).GetProperty(searchResultProperty.Key));
    Expression expression = Expression.Equal(property, constant);
    predicate = predicate.Or(Expression.Lambda<Func<FAQSearchResultItem, bool>>(expression, parameter)).Boost(searchResultProperty.Value);
}

return predicate;

次に、渡されたフィールドでフィルタリングするために検索を実行するときにこれを使用するつもりです。

var query = _context
    .GetQueryable<CustomSearchResultItem>()
    .Where(predicate);

私が抱えている問題は、式ツリーを使用して構築された述語にブーストを適用しても機能しないことです。

私がストレートフォワードを行う場合:

var query = _context
                .GetQueryable<FAQSearchResultItem>();

query = query
   .Where(s => (s.Question == term).Boost(1.1f)
    || (s.WebsiteAnswer == term).Boost(1.5f));

次に、クエリで使用される式は次のように評価されます。

{s => ((s.Question == "water").Boost(1.1) OrElse (s.WebsiteAnswer == "water").Boost(1.5))}

ただし、使用したいメソッドは次のように評価されます。

{param => ((True AndAlso (False OrElse (param.Question == "water"))) AndAlso (param.Language == Context.Language.Name))}

ブーストが適用されていない状態。

式ツリーを使用して生成された述語にブーストを追加するにはどうすればよいですか?

4

1 に答える 1