我试图制作一个 Sitecore 搜索实现,它允许内容编辑器定义要搜索的项目属性,并针对这些字段单独设置提升值。
为了做到这一点,我使用表达式树构建了一个谓词,如下所示:
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))}
没有应用提升。
如何将提升添加到使用表达式树生成的谓词中?