Персонализация результатов поиска, пример надстройки SharePoint
В примере Search.PersonaledResults показано, как персонализировать SharePoint, отфильтровав сведения по значению свойства профиля пользователя. Ниже приведены некоторые примеры персонализации:
- Новостные статьи или другое содержимое, отфильтрованное по стране или расположению.
- Ссылки навигации, отфильтрованные в зависимости от роли пользователя или организации.
- Рестораны или розничные торговые точки списки на основе расположения вашего предприятия.
В этом примере кода используется надстройка, размещенная у поставщика, для отображения результатов поиска пользователю, которые включают все сайты или только сайты групп, к которым у пользователя есть доступ. Для этого в примере:
- Проверяет значение свойства профиля пользователя AboutMe .
- Создает строку фильтра поискового запроса, связанную со значением свойства профиля пользователя AboutMe .
- Выполняет поисковый запрос и отображает результаты поиска.
Подготовка к работе
Чтобы приступить к работе, скачайте пример надстройки Search.PersonalizedResults из проекта Office 365 Developer Patterns and Practices на сайте GitHub.
Примечание.
Код, приведенный в этой статье, предоставляется "как есть" без какой-либо явной или подразумеваемой гарантии, включая подразумеваемые гарантии пригодности для какой-либо цели, для продажи или гарантии отсутствия нарушения прав иных правообладателей.
Использование примера надстройки Search.PersonalizedResults
При выполнении этого примера кода отображается приложение, размещенное у поставщика.
В этой статье описывается сценарий "Выполнение персонализированного поиска по всем шаблонам сайтов с использованием данных профиля ". Выбор параметра Выполнить персонализированный поиск возвращает отфильтрованные результаты поиска, содержащие только сайты групп, как показано на следующем рисунке. Обратите внимание, что столбец Шаблон содержит только сайты типа STS .
Для обработки сценариев персонализации запрос поиска можно изменить следующим образом:
Чтение и проверка значения свойства профиля пользователя для этого пользователя. В этом примере кода проверяется свойство About Me для значения AppTest.
Выполнение определенного курса действий на основе значения свойства профиля пользователя. Например, если значение свойства профиля пользователя About Me — AppTest, этот пример кода удаляет фильтр сайта группы и возвращает результаты поиска, содержащие все сайты.
Введите AppTest в свойстве профиля пользователя About Me.
В верхней части сайта Office 365 выберите фотографию профиля, а затем выберите О себе.
На странице Обо мне выберите пункт изменить профиль.
В разделе Обо мне введите AppTest.
Нажмите кнопку Сохранить все и закрыть.
Выполнение персонализированного поиска
Вернитесь в надстройку Search.PersonalizedResults , размещенную у поставщика, и снова выберите Выполнить персонализированный поиск . Надстройка изменяет фильтр в поисковом запросе, чтобы отобразить все сайты, а не только сайты групп, как показано на следующем рисунке. Столбец Шаблон теперь содержит несколько различных типов шаблонов сайтов.
В файле default.aspx.cs при выборе выполнить персонализированный поиск вызывается метод btnPersonalizedSearch_Click , который выполняет следующие действия:
Использует PeopleManager для получения всех свойств профиля пользователя, выполняющего эту надстройку.
Извлекает и проверяет значение свойства профиля пользователя AboutMe . Если значение свойства AboutMe — AppTest, поисковый запрос извлекает все сайты с помощью строки
contentclass:"STS_Site"
запроса . Если значение свойства AboutMe не является AppTest, фильтр сайта группы добавляется к строке запроса (WebTemplate=STS
), а поисковый запрос извлекает только сайты групп.Вызывает метод ProcessQuery для получения результатов поиска на основе предоставленной строки запроса. ProcessQuery также показывает, как указать список свойств, возвращаемых с результатами поиска.
Вызывает метод FormatResults для форматирования результатов поиска в таблице HTML.
protected void btnPersonalizedSearch_Click(object sender, EventArgs e)
{
var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
using (var clientContext = spContext.CreateUserClientContextForSPHost())
{
// Load user profile properties.
PeopleManager peopleManager = new PeopleManager(clientContext);
PersonProperties personProperties = peopleManager.GetMyProperties();
clientContext.Load(personProperties);
clientContext.ExecuteQuery();
// Check the value of About Me.
string aboutMeValue = personProperties.UserProfileProperties["AboutMe"];
string templateFilter = ResolveAdditionalFilter(aboutMeValue);
// Build the query string.
string query = "contentclass:\"STS_Site\" " + templateFilter;
ClientResult<ResultTableCollection> results = ProcessQuery(clientContext, query);
lblStatus2.Text = FormatResults(results);
}
}
private ClientResult<ResultTableCollection> ProcessQuery(ClientContext ctx, string keywordQueryValue)
{
KeywordQuery keywordQuery = new KeywordQuery(ctx);
keywordQuery.QueryText = keywordQueryValue;
keywordQuery.RowLimit = 500;
keywordQuery.StartRow = 0;
keywordQuery.SelectProperties.Add("Title");
keywordQuery.SelectProperties.Add("SPSiteUrl");
keywordQuery.SelectProperties.Add("Description");
keywordQuery.SelectProperties.Add("WebTemplate");
keywordQuery.SortList.Add("SPSiteUrl", Microsoft.SharePoint.Client.Search.Query.SortDirection.Ascending);
SearchExecutor searchExec = new SearchExecutor(ctx);
ClientResult<ResultTableCollection> results = searchExec.ExecuteQuery(keywordQuery);
ctx.ExecuteQuery();
return results;
}