EPiServer - 如何在不同的EPiServer网站上搜索内容?

时间:2015-10-20 07:49:45

标签: lucene.net episerver

问候EPiServer大师。

想象一下这种情况:

客户有两个不同的EPiServer站点。 一个内部和一个外部网站。 外部使用EPiServer Find的REST API进行搜索。 内部当前正在使用一个基于Lucene索引器的简单搜索页面。

客户希望能够搜索外部内部网站的内容 INSIDE 内部网站。他们并不热衷于购买另一个EPiServer Find许可证以在内部申请。所以基本上他们希望能够在内部搜索外部网站的内容。

为了做到这一点,最合适的方法是什么? 任何建议表示赞赏。

/ ChrisRun

2 个答案:

答案 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应用程序中发生),然后将结果返回到内部网站。

从技术上讲,只有公共网站会使用查找 - 但内部网站可以使用结果。