多站点应用中MediaData选择性索引的实现方法咨询
EPiServer多站点MediaData选择性索引实现方案
核心需求:仅对站点标识为abc或xyz的站点下的MediaData内容建立搜索索引,其余站点的MediaData不纳入索引。
修改后的完整代码
[InitializableModule] [ModuleDependency(typeof(EPiServer.Web.InitializationModule))] public class FindInitialization : IInitializableModule { // 定义允许索引的站点标识集合 private readonly HashSet<string> _allowedSiteIdentifiers = new HashSet<string> { "abc", "xyz" }; public void Initialize(InitializationEngine context) { var contentIndexer = ServiceLocator.Current.GetInstance<ContentIndexer>(); var siteDefinitionResolver = ServiceLocator.Current.GetInstance<ISiteDefinitionResolver>(); // 全局配置MediaData的索引规则 contentIndexer.Conventions.ForInstancesOf<MediaData>() .ShouldIndex(media => IsMediaInAllowedSite(media, siteDefinitionResolver)); } private bool IsMediaInAllowedSite(MediaData media, ISiteDefinitionResolver siteDefinitionResolver) { // 根据MediaData的内容链接,获取其所属的站点定义 var siteDefinition = siteDefinitionResolver.GetSiteDefinitionForContent(media.ContentLink); // 判断站点标识是否在允许列表中 return siteDefinition != null && _allowedSiteIdentifiers.Contains(siteDefinition.Name); } public void Uninitialize(InitializationEngine context) { } }
关键逻辑说明
- 允许站点集合:使用
HashSet<string>存储目标站点标识,确保判断操作的高效性。 - 站点归属判断:通过EPiServer官方提供的
ISiteDefinitionResolver.GetSiteDefinitionForContent方法,根据MediaData的ContentLink精准定位其所属站点,这是判断内容与站点关联的标准方式。 - 索引规则配置:一次性全局配置
MediaData的索引判断逻辑,只有当内容所属站点标识在允许列表内时,才会被纳入搜索索引。
原代码问题修正
原代码中循环遍历站点并重复设置ShouldIndex(p => true),会导致全局索引规则被多次覆盖,最终所有MediaData都会被索引,无法实现站点过滤。修改后的方案通过在索引判断逻辑中直接关联内容所属站点,一次性完成全局规则配置,精准满足需求。
内容的提问来源于stack exchange,提问作者Farhin Shaikh
相关产品推荐
相关产品推荐

