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 迭代。代码工作得很好。我们确实得到了适当的结果,但是如果搜索项的计数很高,则搜索速度会变慢。想知道是否还有其他地方可以提高性能。
解决方案
您需要首先将这些数据编入索引,而不是在运行时尝试将其拼凑在一起。您还应该尝试保持索引精简或使用查询来限制返回的结果以仅提供相关结果。
我同意Jason 的回答,即单独的索引是最好的解决方案之一,并结合包含来自所有引用数据源的内容的计算字段。
此外,我会创建一个自定义爬虫,它会从索引中排除没有任何布局的项目。对于仅用于提供站点搜索结果的索引,您只关心具有布局的项目,因为只有它们具有可导航的 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] 的索引中创建一个自定义计算字段。逻辑与上面相同。然后,您可以在搜索中过滤以仅返回具有布局的结果。
在索引期间包含/组合数据源项目的内容以及仅返回具有布局的项目的组合应该会导致搜索查询的性能更好。
推荐阅读
- php - 将 PHP 数组值放入新数组
- typescript - Nestjs 定义 GraphQL 对象类型得到了这个错误:Schema must contains uniquely named types but contains multiple types named "Address"
- ms-word - 如何在 RMarkdown 文档中添加书目条目
- python - 如何在此熊猫数据框中按日期对文本列进行分组?
- prometheus-pushgateway - Prometheus 推送网关如何增加消息请求
- javascript - 如何使用 django 制作类似 twitter 的主页?
- list - SwiftUI - 在 ForEach 上使用 .refreshable 来增强拉动刷新体验
- dataframe - 在不大于 X 的不同 SKU 数量的约束下最大化
- c - 打印函数中的 size_t 和缓冲区
- html - 从未知数量项目的网格底行上的所有项目中删除边距底部