Я использую С# для запроса 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;
}
Я получаю правильные результаты в том смысле, что получаю только элементы, содержащие ключевое слово, но повышение ничего не делает. Я получаю результаты ключевого слова в описании раньше, чем результаты ключевого слова в заголовке, и если я изменю усиление, чтобы повысить ShortPageSummary выше, чем заголовок, или полностью удалю .Boost(), результаты останутся прежними.
Я не передаю никакой SortBuilder, поэтому сортировка — это то, что Solr делает по умолчанию. Я попытался установить это:
queryArguments.SortBuilder = new GenericSortBuilder<SearchResultItem>(q => q.OrderBy(r => r["score"]));
но это вернуло совершенно беспорядочные результаты, которые, казалось, были в худшем порядке, чем раньше.
РЕДАКТИРОВАТЬ: я проверил журналы Solr, и Boost не добавляется к запросу, который передается Solr.
.Or(predicate1).Or(predicate2)
и т. д. - person MatsLindh   schedule 08.06.2018