Sitecore Solr通过多列表与另一个多列表中的值进行搜索

问题描述 投票:2回答:2

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

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

solr sitecore sitecore7
2个回答
2
投票

如果您已经在产品页面上,则假定您已经拥有该产品项目,并且该产品项目应具有“ ProductType”多列表字段。您可以使用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)来跟踪命名字段,但是您应该构建适当的搜索模型,并实际将ProductTypes定义为List 或类似名称。您可能需要向搜索谓词中添加其他条件,例如path或templateid,以限制结果。之后,您可以执行搜索并使用结果。

就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
     }
}

0
投票

只是对@Matt Gartman代码的改进,不断弹出的错误(ID不包含Contains的定义)是因为.Contains不是Type ID的功能,我建议您按以下字符串类型进行转换]

foreach (ID id in multilistField.TargetIDs)
 {
      pred = pred.Or(x => (Convert.ToString((ID)x[(ObjectIndexerKey)"ProductType"]).Contains(id.toString())));
 }
© www.soinside.com 2019 - 2024. All rights reserved.