Pra*_*ade 2 linq search iqueryable sitecore predicatebuilder
在这里,我试图获得多个术语的搜索结果.说全文="李牛仔裤",然后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);
Run Code Online (Sandbox Code Playgroud)
排序基于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;
}
Run Code Online (Sandbox Code Playgroud)
现在,我需要的是首先获得"lee"的结果并对它们进行排序,然后找到"牛仔裤"的结果并对它们进行排序.最终的搜索结果将首先包含"lee"的排序项的连接集,然后是"jeans".
因此,我们必须首先获得"lee"的结果,然后获得"牛仔裤"的结果
有没有办法按期限获得结果?
您可以使用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--);
}
Run Code Online (Sandbox Code Playgroud)
编辑: 在同一个查询中进行提升和排序是不可能的,至少,排序将撤消由于提升而返回的"相关性"排序.
另一种方法是多次搜索并连接返回单个列表的结果.由于您基本上进行多次搜索,因此效率不高:
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);
}
Run Code Online (Sandbox Code Playgroud)
注意:以上内容不考虑结果集之间的重复.