我如何使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添加到使用表达式树生成的谓词?
最后,我不得不求助于使用谓词构建器,它似乎内置了对boost的支持。很遗憾,因为我无法使用反射来获得SearchResultObject的属性,但我可以实现我打算做的事情…只需要更多的代码