0

我正在使用 C# 来查询 Solr 以进行我的站点搜索。该代码在过滤和搜索特定字段中的关键字方面很好,但我无法让 Boost 工作。我需要使用提升,以便首先返回关键字在标题字段中的项目,然后是描述字段中的关键字,然后是内容中的关键字。

我的搜索代码创建了一个 SearchQuery 并将一个包含 PredicateBuilder 的 QueryBuilder 添加到 SearchQuery.QueryBuilders。这是我的代码的简化版本(去掉了不相关的代码)

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 的查询中。

4

0 回答 0