问候EPiServer大师。
想象一下这种情况:
客户有两个不同的EPiServer站点。 一个内部和一个外部网站。 外部使用EPiServer Find的REST API进行搜索。 内部当前正在使用一个基于Lucene索引器的简单搜索页面。
客户希望能够搜索外部和内部网站的内容 INSIDE 内部网站。他们并不热衷于购买另一个EPiServer Find许可证以在内部申请。所以基本上他们希望能够在内部搜索外部网站的内容。
为了做到这一点,最合适的方法是什么? 任何建议表示赞赏。
/ ChrisRun
答案 0 :(得分:2)
这是一个棘手的问题。 EPiServer查找支持多站点设置,但要求它们托管在同一解决方案中。 EPiServer以这样的方式构建索引作业,即清除整个Find索引,这意味着如果你在两台不同的机器上有相同的Find索引,它们将擦除彼此的索引,实际上你就可以了只有最近编入索引的网站的结果。
我们已经通过更改此模式与EPiServer讨论了此问题,只允许索引器删除运行索引作业的解决方案可用siteId's
的帖子。然而,到目前为止没有运气,相反,我们依赖于hackish解决方案:)
因此,您可以通过一些编码来解决问题,反映内置索引器并确保ReindexTarget
的范围正确(代码易于理解)。完成后,需要在内部和外部环境中使用此索引作业,并且需要删除原始作业。
您无需在内部环境中进行过滤,但在外部环境中,您必须确保仅发布外部结果。如果您的结果包含除页面以外的任何内容,则无法在siteId
上进行过滤,因为全局项目(如文件和图片)没有任何siteId。我们用下面的网址过滤器解决了这个问题。
private static FilterBuilder<ISearchContent> SiteFilterBuilder
{
get
{
var filter = SearchClient.Instance.BuildFilter<ISearchContent>();
filter = filter.Or(x => x.SearchHitUrl.Prefix(EPiServer.Web.SiteDefinition.Current.SiteUrl.AbsoluteUri));
return filter;
}
}
实施
var query = SearchClient.Instance.UnifiedSearch(Language.Swedish)
.For(searchQuery.Query)
.AndInField(x => x.SearchCategories)
.UsingSynonyms()
.OrFilter(SiteFilterBuilder) // will scope to this site
.ApplyBestBets()
.Track()
.TermsFacetFor(x => x.SearchSection)
;
答案 1 :(得分:0)
在我的头脑中,我可以看到将公共查找索引添加到内部网站所涉及的多种风险 - 特别是如果您不希望双向(即在同一查找中索引内部网站)索引)。
一种方法是将搜索端点添加到公共网站,内部网站会调用该搜索端点进行搜索。
基本上,端点(例如控制器操作方法)将使用Find执行搜索(这将在公共Web应用程序中发生),然后将结果返回到内部网站。
从技术上讲,只有公共网站会使用查找 - 但内部网站可以使用结果。