2015-07-28 7 views
2

Здесь я пытаюсь получить результаты поиска для нескольких терминов. Скажите fulltext = «Lee jeans», затем regexresult = {«lee», «jeans»}.Поиск по Sitecore: Получить результаты в терминах

Код:

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

Сортировка основана на Sitecore полей:

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

Теперь, что мне нужно, чтобы иметь результаты для «подветренной» первым и сортирует их, а затем найти результаты для " джинсы "и сортировать их. Окончательный результат поиска будет иметь конкатенированные наборы отсортированных элементов для «lee», а затем для «джинсов».

Таким образом, мы должны получить результаты для «подветренного» первого, а затем результатов для «джинсов»

Есть ли способ, чтобы получить результаты почленно?

+1

Я не совсем понимаю, как использовать. Вы говорите, что сначала хотите, чтобы хиты «lee» сопровождались хитами «jeans». Но если вы сортируете по алфавиту, то весь набор результатов должен быть отсортирован по алфавиту нет? Можете ли вы предоставить примерный ввод с ожидаемым выходом? –

+0

@Christian Текущий код ситуации делает то, что сказал. Но это не то, что мне нужно. Рассмотрим сортировку по умолчанию, т.е. последний обновленный элемент. Ожидаемый случай. Если regexResult имеет {"Jack", "Daniels"}, то мы должны: сначала получить последние обновленные элементы для «Jack». Во-вторых, получите последние обновленные элементы для «Daniels». Итак, результаты будут сначала, а затем вторыми. –

+0

Я не согласен с вашей логикой. Если вы наберете «Джек Дэниелс» в Google, то вы ожидаете, что он будет соответствовать всем с помощью * Jack And Daniels * как наиболее актуальным, сортировка по чем-либо еще должна игнорировать все остальное и просто сортировать по этим критериям. Но в любом случае, я обновляю свой ответ с возможным решением ... – jammykam

ответ

6

Вы можете использовать Query-Time Повышая дать терминам большую актуальность и, следовательно, влияет на рейтинг:

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

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

EDIT: Ускорение и сортировка в одном запросе невозможны, по крайней мере, сортировка отменяет сортировку на основе релевантности, которая была возвращена из-за повышения.

Альтернативный способ заключается в поиске нескольких раз и объединении результатов, возвращающих один список. Не так эффективны, так как вы, по сути делаете многократные поиски:

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

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

+0

В основном я заинтересован в получении всех результатов для «lee» и сортировки их перед тем, как получить результаты для «джинсов». –

+0

@Prathameshdhanawade Что вы сортируете по своим результатам? Pls выдает код для метода сортировки. – jammykam

+0

Я обновил описание .. –