C # Solr запрос, Boost не работает - PullRequest
0 голосов
/ 07 июня 2018

Я использую C # для запроса Solr для поиска по моему сайту.Код подходит для фильтрации и поиска ключевых слов в определенных полях, но я не могу заставить Boost работать.Мне нужно использовать повышение, чтобы сначала возвращались элементы с ключевым словом в поле «Название», затем ключевое слово в поле «Описание», а затем ключевое слово в «контенте».

Мой код поиска создает SearchQuery и добавляет QueryBuilder, содержащий PredicateBuilder, в 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;
}

Я получаю правильные результаты в том смысле, что получаю только те элементы, которые содержатключевое слово, но повышение ничего не делает.Я получаю результаты «ключевое слово в описании» раньше, чем результаты «ключевое слово в заголовке», и если я изменю усиление, сделав Boost-Boost выше, чем «Заголовок», или удаляю .Boost () в целом, результаты останутся прежними.

Я не передаю SortBuilder, поэтому Solr выполняет сортировку по умолчанию.Я попытался установить это:

queryArguments.SortBuilder = new GenericSortBuilder<SearchResultItem>(q => q.OrderBy(r => r["score"]));

, но это вернуло полностью перемешанные результаты, которые, казалось, были в худшем порядке, чем они были прежде.

РЕДАКТИРОВАТЬ: я проверил журналы Solr, а Boost недобавляется в запрос, который передается в Solr.

...