1

我试图制作一个 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))}

没有应用提升。

如何将提升添加到使用表达式树生成的谓词中?

4

1 回答 1

1

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

于 2015-07-26T10:27:51.447 回答