Это сложный вопрос. EPiServer Найти поддержку нескольких сайтов, но требует, чтобы они размещались в одном и том же решении. EPiServer построил работу по индексированию таким образом, что он очищает весь индекс поиска, это означает, что если у вас есть тот же индекс поиска на двух разных машинах, они будут удалять индексы друг друга, эффективно вы получите только результаты от большинства недавно проиндексированный сайт.
Мы обсудили это с EPiServer об изменении этого шаблона, чтобы разрешить индексиру удалять сообщения с siteId's
, доступными для решения, выполняющего задание индекса. Тем не менее, пока нам не повезло, вместо этого мы полагаемся на хакерские решения :)
Итак, что вы спрашиваете, возможно с небольшим количеством кодировок, отражением встроенного индексатора и гарантией, что ReindexTarget
правильно определены (код Легко понять). Когда это делается, это задание индексирования должно использоваться как для внутренней, так и для внешней среды, а исходная работа должна быть удалена.
В вашей внутренней среде нет необходимости фильтровать, но во внешней среде вы должны будете проводить только внешние результаты. Если ваши результаты включают в себя что-то еще, кроме страниц, которые вы не можете фильтровать на siteId
, поскольку глобальные элементы (например, файлы и изображения) не имеют никакого идентификатора сайта.Мы решили это с помощью фильтра 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)
;