【问题标题】:Search Items without presentation details in sitecore在 sitecore 中搜索没有演示详细信息的项目
【发布时间】:2018-12-16 17:31:22
【问题描述】:

提高搜索性能。

我们目前在生产中使用 sitecore 8.1.3,并使用 Lucene Search 来进行搜索。我们将在不久的将来转向 SOLR 或 Coveo 搜索。也就是说,我们正在努力改进我们网站上的搜索功能。

在当前情况下,如果用户在我们的网站上进行搜索,Lucene 搜索会为我们提供来自 sitecore 内容项的适当搜索结果。结果是一个项目列表,其中一些具有演示详细信息,而有些没有演示详细信息(基本上是数据源项目,或拉入多列表字段项目)。我们直接向用户显示具有演示详细信息的结果,但是,数据源项目没有附加演示详细信息,因此对于此类项目,我们通过 sitecore 链接显示这些项目在演示详细信息中被称为数据源项目的项目或在多列表字段中引用。

我们正在使用Globals.LinkDatabase.GetItemReferrers(item, false) 方法来获取结果项所指的项。我们知道这种方法是一种沉重的方法。为了提高性能,我们正在过滤使用Globals.LinkDatabase.GetItemReferrers(item, false) 方法时返回的项目。我们仅选择项目的最新版本,仅当项目具有演示详细信息时才选择项目,仅当项目与上下文语言的语言相同时才选择。如果当前项目没有展示详情,它将使用相同的函数递归地搜索具有展示详情的相关项目。我们拥有的这种逻辑或代码可以帮助我们在一定程度上提高性能并产生所需的结果。

但是,如果搜索结果的数量很大,此代码会降低其性能。假设我搜索一个项目,其中 Lucene 搜索返回我说 10 个项目,然后我们的自定义搜索代码将产生我说 100 个相关项目(假设在结果中找到的项目的数据源项目可以在不同项目中重复使用) .当 Lucene 搜索提供大量结果(例如 500 个)时,性能会下降。在这种情况下,我们将在 500 个项目及其相关项目上递归运行我们的代码。为了获得更好的性能,我们尽可能使用 LINQ 查询而不是 foreach 迭代。代码工作得很好。我们确实得到了适当的结果,但是如果搜索项的计数很高,则搜索速度会变慢。想知道是否还有其他可以提高性能的地方。

【问题讨论】:

    标签: lucene sitecore


    【解决方案1】:

    提高性能的最佳方法是拥有一个自定义索引,其中包含您要搜索的结果并且不包含您不想返回的项目。这样,您的过滤就在索引期间“预先完成”。

    通常的做法是使用包含页面所有“文本”的计算字段(将来自数据源的内容整理在一起),以便页面的全部内容位于索引中的字段中。这样,即使文本匹配在数据源上,页面仍然会作为有效的搜索结果返回。

    Kam Figy 有一篇关于这个话题的博客:https://kamsar.net/index.php/2014/05/indexing-subcontent/

    请注意,除了计算字段之外,您还需要使用 Sitecore 配置补丁文件将字段修补到索引中。 Kam 的博客也展示了一个例子。

    【讨论】:

      【解决方案2】:

      您需要在开始时将这些数据编入索引,而不是在运行时尝试将其拼凑在一起。您还应该尝试保持索引精简或使用查询来限制返回的结果以仅提供相关结果。

      我同意answer from Jason 的观点,即单独的索引是最好的解决方案之一,并结合包含来自所有引用数据源的内容的计算字段。

      此外,我会 create a custom crawler 从索引中排除没有任何布局的项目。对于仅用于提供站点搜索结果的索引,您只关心具有布局的项目,因为只有它们具有可导航的 URL。

      namespace MyProject.CMS.Custom.ContentSearch.Crawlers
      {
          public class CustomItemCrawler : Sitecore.ContentSearch.SitecoreItemCrawler
          {
              protected override bool IsExcludedFromIndex(SitecoreIndexableItem indexable, bool checkLocation = false)
              {
                  bool isExcluded = base.IsExcludedFromIndex(indexable, checkLocation);
      
                  if (isExcluded)
                      return true;
      
                  Item obj = (Item)indexable;
      
                  return obj.Visualization != null && obj.Visualization.Layout != null;
              }
      
              protected override bool IndexUpdateNeedDelete(SitecoreIndexableItem indexable)
              {
                  Item obj = indexable;
                  return obj.Visualization != null && obj.Visualization.Layout != null;
              }
          }
      }
      

      如果由于某种原因您不希望创建单独的索引,或者您只想保留一个索引(因为您使用的是 Content Search API 并且需要为您的组件查询提供完整的索引,或者甚至只是为了最小化跨多个索引的索引速度)然后我会在存储 [true/false] 的索引中考虑creating a custom computed field。逻辑与上面相同。然后您可以filter in your search 只返回具有布局的结果。

      在索引期间包含/组合数据源项目的内容和仅返回具有布局的项目的组合应该会导致搜索查询的性能更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-09
        • 2016-04-11
        • 2018-07-06
        • 1970-01-01
        • 2012-09-22
        • 1970-01-01
        • 2020-09-05
        相关资源
        最近更新 更多