2015-10-20 3 views
2

Приветствия Гуру EPiServer.EPiServer - как искать контент на разных сайтах EPiServer?

Изображение этого сценария:

Клиент имеет два различных EPiServer-сайтов. Один внутренний и один внешний веб-сайт. Внешняя использует API REST API-поиска EPiServer для поиска. В настоящее время внутренний использует простую страницу поиска, основанную на индексаторе Lucene.

Заказчик хочет, чтобы иметь возможность искать как внутреннее содержание внешний и сайта ВНУТРИ внутренний сайт. Они не заинтересованы в том, чтобы покупать другую лицензию EPiServer Find для применения на внутреннем уровне. Таким образом, в основном они хотят иметь возможность искать содержимое внешнего сайта в то время как внутри внутреннего.

Каким будет подходящий подход для этого? Любые предложения оценены.

/ChrisRun

ответ

1

Это сложный вопрос. 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) 
; 
0

Off верхней части моей головы, я могу видеть несколько рисков, связанных с добавлением индекса общественности Find на внутренний сайт - особенно, если вы не хотите это двусторонний (т.е. индексирование внутреннего сайт в том же списке поиска).

Одним из подходов может быть добавление конечной точки поиска на общедоступный веб-сайт, который внутренний веб-сайт вызывает для поиска.

В основном, что конечная точка (например, метод действия контроллера) выполнила поиск с использованием Find (это произойдет в общедоступном веб-приложении), а затем вернет результат на внутренний веб-сайт.

Технически, только открытый веб-сайт будет использовать Find - но результаты будут доступны для внутреннего веб-сайта.