2015-07-28 41 views
2

在這裏,我正在嘗試獲取多個字詞的搜索結果。說全文=「李牛仔褲」,然後regexresult = {「李」,「牛仔褲」}。Sitecore search:按字詞獲取結果字詞

代碼:

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

我不太清楚用例。你說你首先需要「李」的命中,然後是「牛仔褲」命中。但是,如果按字母順序排序,那麼整個結果集應按字母順序排序否?你能提供一些樣本輸入和預期的輸出嗎? –

+0

@Christian當前的代碼情況正在做你說的。但那不是我需要的。考慮默認排序即。最新更新的項目。預期的情況。如果regexResult有{「Jack」,「Daniels」}那麼我們應該:首先,獲取「Jack」的最新更新項目。其次,獲取「Daniels」的最新更新項目。所以,結果將是第一個,然後是第二個。 –

+0

我不同意你的邏輯。如果您在Google中輸入「Jack Daniels」,那麼您會希望它與* Jack和Daniels *中的所有內容匹配最相關,任何其他排序都應該忽略其他所有內容,然後按照該條件進行排序。但無論如何,我已經用一個可能的解決方案更新我的答案... – jammykam

回答

6

您可以使用查詢時間推進給術語的詳細相關性,因此影響排名:

你想給的第一項最高提升,然後逐漸減少每個附加項:

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

注意:上述內容不考慮結果集之間的重複項。

+0

我主要關心的是獲得「李」的所有結果,並在得到「牛仔褲」的結果之前對它們進行排序。 –

+0

@Prathameshdhanawade你在對結果進行排序?請張貼排序方法的代碼。 – jammykam

+0

我已更新了說明.. –