Поиск по сайту: Получить результаты по терминам

Здесь я пытаюсь получить результаты поиска по нескольким терминам. Скажите 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, чтобы придать терминам большую актуальность и, следовательно, повлиять на рейтинг:

Вы хотите дать первому члену наибольший импульс, а затем постепенно уменьшать для каждого дополнительного срока:

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);
}

ПРИМЕЧАНИЕ. Выше не учитываются дубликаты между наборами результатов.

Другие вопросы по тегам