Поиск по сайту: Получить результаты по терминам
Здесь я пытаюсь получить результаты поиска по нескольким терминам. Скажите fulltext="Lee jeans", затем regexresult={"lee","jeans"}.
Код:
IProviderSearchContext searchContext = index.CreateSearchContext();
IQueryable<SearchItem> scQuery = searchContext.GetQueryable<SearchItem>();
var predicate = PredicateBuilder.True<SearchItem>();
//checking if the fulltext includes terms within " "
var regexResult = SearchRegexHelper.getSearchRegexResult(fulltext);
regexResult.Remove(" ");
foreach (string term in regexResult)
{
predicate = predicate.Or(p => p.TextContent.Contains(term));
}
scQuery = scQuery.Where(predicate);
IEnumerable<SearchHit<SearchItem>> results = scQuery.GetResults().Hits;
results=sortResult(results);
Сортировка основана на полях сайта:
switch (query.Sort)
{
case SearchQuerySort.Date:
results = results.OrderBy(x => GetValue(x.Document, FieldNames.StartDate));
break;
case SearchQuerySort.Alphabetically:
results = results.OrderBy(x => GetValue(x.Document, FieldNames.Profile));
break;
case SearchQuerySort.Default:
default:
results = results.OrderByDescending(x => GetValue(x.Document, FieldNames.Updated));
break;
}
Теперь мне нужно сначала получить результаты для "Ли" и отсортировать их, а затем найти результаты для "джинсы" и отсортировать их. Окончательный результат поиска будет содержать объединенные наборы отсортированных элементов сначала для "ли", а затем для "джинсов".
Таким образом, мы должны были бы сначала получить результаты для "Ли", а затем результаты для "джинсы"
Есть ли способ получить результаты по терминам?
1 ответ
Вы можете использовать Query-Time Boosting, чтобы придать терминам большую актуальность и, следовательно, повлиять на рейтинг:
- Sitecore 7: шесть типов поискового продвижения
- Lucene Boost с помощью LINQ в Sitecore 7 ContentSearch
Вы хотите дать первому члену наибольший импульс, а затем постепенно уменьшать для каждого дополнительного срока:
var regexResult = SearchRegexHelper.getSearchRegexResult(fulltext);
regexResult.Remove(" ");
float boost = regexResult.Count();
foreach (string term in regexResult)
{
predicate = predicate.Or(p => p.TextContent.Contains(term)).Boost(boost--);
}
РЕДАКТИРОВАТЬ: Повышение и сортировка в одном запросе невозможна, по крайней мере, сортировка отменяет сортировку на основе "релевантности", которая была возвращена из-за повышения.
Альтернативным способом будет поиск несколько раз и объединение результатов, возвращающих один список. Не так эффективно, так как вы по сути делаете несколько поисков:
IProviderSearchContext searchContext = index.CreateSearchContext();
var items = new List<SearchResultItem>();
var regexResult = SearchRegexHelper.getSearchRegexResult(fulltext);
regexResult.Remove(" ");
foreach (string term in regexResult)
{
var results = searchContext.GetQueryable<SearchResultItem>()
.Where(p => p.Content.Contains(term));
SortSearchResults(results); //results passed in by reference, no need to return object to set it back to itself
items.AddRange(results);
}
ПРИМЕЧАНИЕ. Выше не учитываются дубликаты между наборами результатов.