我正在使用C#来查询Solr以进行我的网站搜索。代码在过滤和搜索特定字段中的关键字方面很好,但我无法使Boost工作。我需要使用提升,以便首先返回关键字在Title字段中的项目,然后在Description字段中返回关键字,然后在Content中返回关键字。
我的搜索代码创建了一个SearchQuery,并向SearchQuery.QueryBuilders添加了一个包含PredicateBuilder的QueryBuilder。这是我的代码的简化版本(取出不相关的代码)
public SearchQueryResults Search(string keywords){
SearchQuery<KofaxSearchResultItem> queryArguments = new SearchQuery<KofaxSearchResultItem>();
List<IPredicateBuilder<KofaxSearchResultItem>> queryBuilders = new List<IPredicateBuilder<KofaxSearchResultItem>>();
var keywordPredicate = new ExactKeywordPredicateBuilder(keywords, _sitecoreContext);
queryArguments.QueryBuilders = queryBuilders;
var results = _searchManager.GetResults<KofaxSearchResultItem>(queryArguments);
(return results after some more stuff)
}
class ExactKeywordPredicateBuilder : IPredicateBuilder<KofaxSearchResultItem>
{
public string Query { get; set; }
public List<Guid> ContentTypeFilters { get; set; }
SearchTaxonomyUtil SearchTaxonomyUtil { get; set; }
public ExactKeywordPredicateBuilder(string query, ISitecoreContext sitecoreContext, List<Guid> contentTypeFilters = null)
{
Query = query;
ContentTypeFilters = contentTypeFilters;
SearchTaxonomyUtil = new SearchTaxonomyUtil(sitecoreContext);
}
public Expression<Func<KofaxSearchResultItem, bool>> Build()
{
return SearchTaxonomyUtil.GetKeywordPredicate(Query, ContentTypeFilters);
}
}
public Expression<Func<SearchResultItem, bool>> GetKeywordPredicate(string keyword)
{
keyword = keyword.ToLower();
var predicate = PredicateBuilder.True<SearchResultItem>();
predicate = predicate.Or(r => r.Title.Contains(keyword)).Boost(1000f);
predicate = predicate.Or(r => r.ShortPageSummary.Contains(keyword)).Boost(10f);
predicate = predicate.Or(r => r.Content.Contains(keyword)).Boost(0.1f);
return predicate;
}
我得到了正确的结果,因为我只获得包含关键字的项目,但是提升没有做任何事情。我在关键字标题结果之前获得了关键字描述结果,如果我更改提升以使ShortPageSummary提升高于标题,或者完全删除.Boost(),则结果保持不变。
我没有传递任何SortBuilder,因此排序是Solr默认执行的操作。我试着设置这个:
queryArguments.SortBuilder = new GenericSortBuilder<SearchResultItem>(q => q.OrderBy(r => r["score"]));
但是那些结果完全混乱,似乎比以前更糟糕。
编辑:我检查了Solr日志,并且没有将Boost添加到传递给Solr的查询中。