Использование API поиска в модели надстройки SharePoint

Подход, который вы используете для выполнения поиска в службе поиска SharePoint, отличается в новой модели надстройки SharePoint, чем в коде полного доверия. В типичном сценарии с кодом полного доверия (FTC) или решением фермы серверная объектная модель SharePoint (переопределения веб-части "Содержимое по запросу") или веб-службы поиска использовались для выполнения поиска в службе поиска SharePoint.

В сценарии модели надстройки SharePoint поиск выполняется с помощью службы поиска SharePoint с помощью CSOM или REST API.

Руководящие принципы высокого уровня

Как правило, мы хотели бы предоставить следующие высокоуровневые рекомендации по созданию и настройке семейств веб-сайтов и дочерних сайтов, а затем развертывать артефакты, конфигурации и ресурсы фирменной символики для них.

  • Использование проверки подлинности AppOnly не поддерживается ни для каких операций службы поиска.
    • Это связано с тем, что служба поиска обращается к службе профилей пользователей для поиска сведений профиля пользователя, а UPS не поддерживает проверку подлинности AppOnly.
    • Таким образом, так как релевантность поиска и другие аспекты поиска зависят от конкретного пользователя и атрибутов его профиля, шаблон проверки подлинности AppOnly не будет работать.

Параметры для выполнения поисковых запросов с помощью службы поиска SharePoint

У вас есть несколько вариантов для выполнения поиска с помощью службы поиска SharePoint.

  • API CSOM для .NET
  • JavaScript CSOM (JSOM) API
  • REST API

API CSOM для .NET

В этом варианте для выполнения поиска в службе поиска SharePoint используется API CSOM .Net.

  • Этот API доступен только в управляемом коде .NET.

Для каких случаев он подходит?

  • Этот API отлично подходит для надстроек, размещенных у поставщика, длительных операций или других сценариев на стороне сервера, которые выполняются на платформе .NET.
  • Некоторые примеры таких сценариев — ASP.NET веб-сайты MVC, службы веб-API ASP.NET, консоль .NET или приложения Windows, а также веб-задания Azure.

Приступая к работе

В следующем примере показано, как выполнять поиск с помощью службы поиска SharePoint с помощью API CSOM для .Net. В этом примере также показано, как получить доступ к профилю пользователя для персонализации результатов поиска.

Страница API поиска и персонализации. Текст на изображении. Выполнение поиска в API поиска. Укажите фильтр поиска для поискового запроса на уровне клиента. Текстовое поле содержит слово Test. Текст кнопки: Выполнить простой поиск. Выполните персонализированный поиск по всем шаблонам сайтов с использованием данных профиля. Если сведения обо мне НЕ содержат текст AppTest, мы ищем только сайты, которые являются сайтами групп (WebTemplate = STS). Если приложение AppTest присутствует, поиск выполняется на всех сайтах. Сценарий: отображение сайтов или агрегированных данных из определенных расположений на основе профиля пользователя. Примером может быть агрегирование страниц новостей, которые помечены только идентификатором, соответствующим текущему расположению пользователя или городу. Текст кнопки: Выполнение персонализированного поиска.

В статье Как выполнять персонализированные поисковые запросы с помощью CSOM (видео O365 PnP) описано, как выполнить персонализированные поисковые запросы(пример O365 PnP).

Метод btnPerformSearch_Click в классе Default.aspx.cs выполняет поиск текстового значения, введенного пользователем в поле поиска, и ограничивает поиск всем содержимым, хранящимся в семействе веб-сайтов. Параметр contentclass:"STS_Site" ограничивает область поиска семействами веб-сайтов.

protected void btnPerformSearch_Click(object sender, EventArgs e)
{
    var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);

    using (var clientContext = spContext.CreateUserClientContextForSPHost())
    {
        // Since in this case we want only site collections, let's filter based on result type
        string query = searchtext.Text + " contentclass:\"STS_Site\"";
        ClientResult<ResultTableCollection> results = ProcessQuery(clientContext, query);
        lblStatus1.Text = FormatResults(results);
    }
}

Метод btnPersonalizedSearch_Click в классе Default.aspx.cs выполняет тот же поиск, что и метод btnPerformSearch_Click, а также добавляет дополнительный параметр на основе профиля текущего пользователя. Класс PeopleManager используется для доступа к свойствам профиля текущего пользователя.

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 teh value for About Me to investigate current values
        string aboutMeValue = personProperties.UserProfileProperties["AboutMe"];
        string templateFilter = ResolveAdditionalFilter(aboutMeValue);
        // Let's build the query
        string query = "contentclass:\"STS_Site\" " + templateFilter;
        ClientResult<ResultTableCollection> results = ProcessQuery(clientContext, query);
        lblStatus2.Text = FormatResults(results);
    }
}

Метод ResolveAdditionalFilter в классе Default.aspx.cs оценивает свойства профиля текущего пользователя и возвращает применимый параметр поиска. В этом примере, если свойство профиля пользователя aboutMeValue содержит AppTest, возвращается параметр поиска WebTemplate=STS. Этот параметр ограничивает область поиска сайтами, созданными с помощью шаблона STS (сайт группы).

private string ResolveAdditionalFilter(string aboutMeValue)
{
    if (!aboutMeValue.Contains("AppTest"))
    {
        return "WebTemplate=STS";
    }

    return "";
}

В обоих случаях метод ProcessQuery в классе Default.aspx.cs использует класс SearchExecutor для выполнения поискового запроса и возврата результатов.

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

JavaScript CSOM (JSOM) API

В этом варианте вы используете API JAVAScript CSOM (JSOM) для выполнения поиска в службе поиска SharePoint.

  • Этот API доступен только в клиентском коде JavaScript.

Для каких случаев он подходит?

  • Этот API отлично подходит для надстроек, размещенных в SharePoint, и надстроек, размещенных у поставщика, работающих на любой веб-платформе.
  • Примерами таких сценариев являются ASP.NET веб-сайты MVC, веб-сайты PHP, веб-сайты Python и т. д.

Начало работы

В следующем примере кода показано, как выполнять поиск с помощью службы поиска SharePoint с помощью API JAVAScript CSOM (JSOM). В этом примере выполняется поиск всех элементов, содержащих термин "Blizzard".

var context = SP.ClientContext.get_current();

var keywordQuery =
new Microsoft.SharePoint.Client.Search.Query.KeywordQuery(context);

keywordQuery.set_queryText("Blizzard");

var searchExecutor =
new Microsoft.SharePoint.Client.Search.Query.SearchExecutor(context);

results = searchExecutor.executeQuery(keywordQuery);

context.executeQueryAsync(onGetEventsSuccess, onGetEventsFail);

API REST

В этом варианте вы используете REST API для выполнения поиска в службе поиска SharePoint.

  • Этот API является наиболее гибким, так как он доступен как в коде на стороне сервера, так и на стороне клиента.
  • Корневая конечная точка REST API службы поиска SharePoint:
    • <https:// tenant>/site/_api/search/query
  • Вот несколько простых примеров:
    • Поиск по ключевым словам

      https://tenant/site/_api/search/query?querytext='{Apples}'
      
    • Выбор определенных свойств

      https://tenant/site/_api/search/query?querytext='test'&selectproperties='Rank, Title'
      
    • сортировке;

      https://tenant/site/_api/search/query?querytext='Oranges'&sortlist='LastModifiedTime:ascending'
      

Для каких случаев он подходит?

Этот API отлично подходит для надстроек, размещенных в SharePoint, и надстроек, размещенных у поставщика, работающих на любой веб-платформе.

  • Некоторые примеры таких сценариев— ASP.NET веб-сайты MVC, веб-сайты PHP, веб-сайты Python, службы веб-API ASP.NET, консоль .NET или приложения Windows, веб-задания Azure и т. д.

Начало работы

Параметр на стороне сервера

В следующем примере показано, как выполнять поиск в службе поиска SharePoint с помощью REST API из управляемого кода .NET.

  • EmployeeDirectory (учебные материалы по OfficeDev)

    Метод Index в классе HomeController.cs выполняет поиск всех пользователей, фамилия которых начинается с текстового значения, которое щелкает пользователь.

    var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);
    
    string accessToken = spContext.UserAccessTokenForSPHost;
    
    //Build the REST API request
    StringBuilder requestUri = new StringBuilder()
    .Append(spContext.SPHostUrl)
    .Append("/_api/search/query?querytext='LastName:")
    .Append(startLetter)
    .Append("*'&selectproperties='LastName,FirstName,WorkEmail,WorkPhone'&sourceid='B09A7990-05EA-4AF9-81EF-EDFAB16C4E31'&sortlist='FirstName:ascending'");
    
    //Create HTTP Client
    HttpClient client = new HttpClient();
    //Add the REST API request
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri.ToString());
    //Set accept header
    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
    //Set Bearer header equal to access token
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
    
    //Send the REST API request
    HttpResponseMessage response = await client.SendAsync(request);
    //Set the response
    string responseString = await response.Content.ReadAsStringAsync();
    

В статье Создание надстроек SharePoint с использованием поиска (видео O365 PnP) описывается руководство по EmployeeDirectory (учебные материалы по OfficeDev).

Параметр на стороне клиента

В следующем примере кода показано, как выполнять поиск в службе поиска SharePoint с помощью REST API из JavaScript. В этом примере выполняется поиск всех элементов, содержащих термин "Lacrosse".

$.ajax({
    url: "http://site/_api/search/" +
          "query?querytext='{Lacrosse}‘",
    method: "GET",
    headers: {
        "accept": "application/json;odata=verbose",
    },
    success: onSuccess,
    error: onError
});

Образцы PnP

Область применения

  • Office 365 Multi Tenant (MT)
  • Office 365 Dedicated (D)
  • Локальное развертывание SharePoint 2013