Sitecore Solr 使用来自另一个多重列表的值按多重列表进行搜索



我有一组产品项目。每个产品物料都有一个指向一组产品类型物料的多列表字段。在产品页面上,我想显示相关项目的分页列表。这些应该是与当前所选物料共享产品类型的商品。我遇到了一些麻烦,因为产品可以有多种类型。我需要拆分当前项目上的类型列表,并根据表达式中的产品列表进行检查。出于某种原因,拆分和包含正在抛出运行时异常,我真的无法弄清楚为什么。我看到了一些关于谓词生成器用于动态查询的事情,我将尝试将其用于我目前拥有的内容,但我想知道为什么不能直接在 where 子句中完成此操作。

我遇到的另一个问题是存储在solr中的id列表被剥夺了它们的"{","}"和"-"字符。

如果您已经在产品页面上,我假设您已经拥有产品项目,并且该产品项目应该有一个"产品类型"多列表字段。您可以使用 Sitecore.Data.Fields.MultilistFiled 来避免担心必须拆分原始值。

然后,您可以使用 Sitecore 的谓词生成器来构建您的搜索谓词,我假设您希望查找具有一种类似产品类型的所有产品。 应根据需要调整此搜索逻辑。 我正在使用ObjectIndexerKey(在此处查看更多内容-> http://www.sitecore.net/Learn/Blogs/Technical-Blogs/Sitecore-7-Development-Team/Posts/2013/05/Sitecore-7-Predicate-Builder.aspx(来跟踪命名字段,但是您应该构建一个适当的搜索模型,并实际将ProductType定义为List或类似的东西。 您可能还需要向搜索谓词添加其他条件,例如路径或模板 ID 以限制结果。 之后,您只需执行搜索并使用结果即可。

就 Solr 剥离特殊字符而言,这是基于字段上使用的分析器的预期行为。 Sitecore 和 Solr 将应用适当的查询时间分析器来匹配内容,因此只要使用正确的类型,您就不必担心格式问题。

var pred = PredicateBuilder.True<SearchResultItem>();
Sitecore.Data.Fields.MultilistField multilistField = Sitecore.Context.Item.Fields["ProductTypes"];
if (multilistField != null)
{
     foreach (ID id in multilistField.TargetIDs)
     {
          pred = pred.Or(x => ((ID)x[(ObjectIndexerKey)"ProductType"]).Contains(id);
     }
}

ISearchIndex _searchIndex = ContentSearchManager.GetIndex("sitecore_master_index");  // change to proper search index
using (var context = _searchIndex.CreateSearchContext())
{
     var relatedProducts = context.GetQueryable<SearchResultItemModel>().Where(pred);
     foreach(var relatedProduct in relatedProducts)
     {
          // do something here with search results
     }
}

只是对@Matt Gartman代码的改进,不断弹出的错误(ID 不包含包含的定义(是因为 .包含不是类型 ID 的功能,我建议您将其转换为字符串类型,如下所示

foreach (ID id in multilistField.TargetIDs)
 {
      pred = pred.Or(x => (Convert.ToString((ID)x[(ObjectIndexerKey)"ProductType"]).Contains(id.toString())));
 }

最新更新