我如何使Sitecore内容搜索增强工作中的表达式树

本文关键字:工作中 增强 表达式 搜索 何使 Sitecore | 更新日期: 2023-09-27 18:04:41

我正在尝试做一个Sitecore搜索实现,它将允许内容编辑器定义条目属性进行搜索,并针对这些字段单独设置boost值。

为了做到这一点,我使用表达式树建立一个谓词,如下所示:

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);

我遇到的问题是,对使用表达式树构建的谓词应用boost不起作用。

如果我直接写

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))}

没有使用升压

我怎么能得到boost添加到使用表达式树生成的谓词?

我如何使Sitecore内容搜索增强工作中的表达式树

最后,我不得不求助于使用谓词构建器,它似乎内置了对boost的支持。很遗憾,因为我无法使用反射来获得SearchResultObject的属性,但我可以实现我打算做的事情…只需要更多的代码