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

EPiServer - how to search content in different EPiServer websites?

问候 EPiServer 大师。

想象一下这个场景:

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

客户希望能够同时搜索外部内部站点的内容INSIDE 内部网站。他们不喜欢必须购买另一个 EPiServer Find 许可证才能在内部应用的想法。所以基本上他们希望能够在内部网站中搜索外部网站的内容。

执行此操作的正确方法是什么? 任何建议表示赞赏。

/克里斯润

我突然想到,将 public 查找索引添加到内部站点会涉及多种风险 - 特别是如果您不希望它是双向的(即索引内部站点)在同一个查找索引中)。

一种方法是将搜索端点添加到 public 网站,内部网站调用它来进行搜索。

基本上,该端点(例如控制器操作方法)将使用 Find 执行搜索(这将发生在 public 网络应用程序内部),然后 return 将结果发送到内部网站。

从技术上讲,只有 public 网站会使用“查找”- 但结果可用于内部网站。

这是一个棘手的问题。 EPiServer Find 支持多站点设置,但要求它们托管在同一解决方案中。 EPiServer 构建索引作业的方式是 清除整个查找索引 ,这意味着如果您在两台不同的机器上有相同的查找索引,它们将擦除彼此的索引,有效地您'将只有最近索引站点的结果。

我们已经与 EPiServer 讨论过更改此模式以仅允许索引器删除具有 siteId's 可用于解决方案 运行 索引作业的帖子。然而,到目前为止运气不好,相反我们依赖于 hackish 解决方案 :)

因此,通过一些编码可以实现您的要求,反映内置索引器并确保 ReindexTarget 的范围正确(代码易于理解)。完成后,需要在内部和外部环境中使用此索引作业,并且需要删除原始作业。

在您的内部环境中无需过滤,但在外部环境中,您必须确保只发布外部结果。如果您的结果包含页面以外的任何内容,您将无法在 siteId 上进行过滤,因为全局项目(如文件和图像)没有任何站点 ID。我们已经使用如下所示的 url-过滤器解决了这个问题。

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)
;