0

所以这里是总结:

Sitecore - SOLR 索引查询

我有一些我试图使用一组不同的网站检索的项目。

我有一个查询:

query = query.Where(x => x.Language == this.ItemLanguage)
             .Where(x => x.Templates.Contains(new Guid("94c1f3e5ac174a319cc5bbb942fe80c6")));

这将正确返回所有项目。

我需要为此查询添加一个动态列表调用。

就像是:

.Where(x => x.Site.Any(y => siteNames.Contains(y)));

我尝试添加这行代码,但出现错误:

System.ArgumentException: '参数必须是数组'

(一些细节)

返回的项目 (x) 的“站点”字段为List<string>

siteNames 是一个List<String>可变站点名称

以下代码适用于其他地方:

.Where(x => x.Site.Contains("somesite"));

有没有办法管理动态列表,或者我需要根据 siteNames 列表中的项目数手动生成这个表达式?

.Where(x => x.Site.Contains("dynamic") || x.Site.Contains("dynamic")
         || x.Site.Contains("dynamic") || x.Site.Contains("dynamic") 
         || and so on);

这是完整的代码示例:

using (var context = Sitecore.ContentSearch.ContentSearchManager.GetIndex(AccelConstants.SEARCH_INDEX).CreateSearchContext())
{
            IQueryable<SearchResultModel> query = context.GetQueryable<LMSSearchResultModel>();
            SearchResults<SearchResultModel> results = null;
            List<string> siteNames = new List<string>();
            siteNames = this.SiteNames;
            // Define the base search
            query = query.Where(x => x.Language == this.ItemLanguage)
                         .Where(x => x.Templates.Contains(new Guid("94c1f3e5ac174a319cc5bbb942fe80c6")))
                         .Where(x => x.Site.Any(p => siteNames.Contains(p)));

            // Execute the query
            results = query.GetResults();
}

site 字段是 Site_SM 的 solr 字段,其输出如下: 使用名称“Site”的原因是 Sites 也是一个字段。这不是我可以控制的代码,所以我正在使用我所拥有的。

“site_sm”:[“登录”,“管理员”,“服务”,“covid19”,“调度程序”,“系统”,“发布者”],

搜索结果模型只是将计算的 solr 字段转换为 c#

public class SearchResultModel : SearchResultItem
{
    [IndexField("_templates")]
    public List<Guid> Templates { get; set; }

    [IndexField("site_sm")]
    public List<string> Site { get; set; }
}
4

1 回答 1

0

好的,所以这是一种让我的搜索工作的相当黑客的方式。

using (var context = Sitecore.ContentSearch.ContentSearchManager.GetIndex(AccelConstants.SEARCH_INDEX).CreateSearchContext())
{
     IQueryable<SearchResultModel> query = context.GetQueryable<LMSSearchResultModel>();
     SearchResults<SearchResultModel> results = null;
     List<string> siteNames = new List<string>();
     siteNames = this.SiteNames;

     // Define the base search
     // remove site filtering from query
     query = query.Where(x => x.Language == this.ItemLanguage)
                  .Where(x => x.Templates.Contains(new Guid("94c1f3e5ac174a319cc5bbb942fe80c6")));

     // Execute the query
     results = query.GetResults();

     // Get the results
     foreach (var hit in results.Hits)
     {
           //move site filter code to here
           if (hit.Document != null && hit.Document.Site.Any(p => siteNames.Contains(p)))
           {
                // Add the model to the results.                     
           }
           else
           {

           }
     }
}

通过将站点过滤器代码移动到查询之后,站点List<string>被实例化并在调用时具有价值。这似乎是我的问题。

然后,这使我可以按 siteNames 中的站点进行过滤List<string>并获得最终结果集。

我不知道这是否是使这部分代码工作的最佳方式,但它确实有效。

于 2020-05-01T16:32:37.163 回答