Sitecore搜索:按术语获取结果

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"的结果,然后获得"牛仔裤"的结果

有没有办法按期限获得结果?

jam*_*kam 6

您可以使用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)

注意:以上内容不考虑结果集之间的重复.

  • "在同一个查询中进行提升和排序是不可能的",实际上如果你使用solr(不确定lucene)是可能的.您可以编写排序查询,如:dataQuery.OrderByDescending(i => i ["score"]).ThenByDescending(i => i.Title); (2认同)