在Sitecore中搜索没有演示文稿详细信息的项目

时间:2018-07-09 05:22:08

标签: lucene sitecore

提高搜索性能。

我们目前正在生产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迭代。该代码工作得很好。我们确实获得了适当的结果,但是如果搜索项的计数很高,则搜索速度会降低。想知道是否还有其他地方可以改善性能。

2 个答案:

答案 0 :(得分:1)

提高性能的最佳方法是拥有一个自定义索引,该索引具有要搜索的结果,并且不包含不希望返回的项目。这样,您的过滤在索引编制过程中就可以“预先完成”。

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

金·菲(Kam Figy)的博客对此主题进行了介绍:https://kamsar.net/index.php/2014/05/indexing-subcontent/

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

答案 1 :(得分:0)

您首先需要索引这些数据,而不是尝试在运行时将它们组合在一起。您还应该尝试使索引保持精简或使用查询来限制返回的结果以仅提供相关结果。

我同意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仅返回具有布局的结果。

在索引期间包含/组合数据源项目的内容以及仅返回具有布局的项目的组合应该可以使搜索查询的性能大大提高。