Uso de api de búsqueda en el modelo de complemento de SharePoint
El enfoque que se usa para ejecutar búsquedas con el servicio de búsqueda de SharePoint es diferente en el nuevo modelo de complemento de SharePoint que con código de plena confianza. En un escenario típico de solución de granja o código de plena confianza (FTC), el modelo de objetos del lado servidor de SharePoint (invalidaciones del elemento web Content By Query) o los servicios web de búsqueda se usaron para ejecutar búsquedas con el servicio de búsqueda de SharePoint.
En un escenario de modelo de complemento de SharePoint, se ejecutan búsquedas con el servicio de búsqueda de SharePoint a través de las API de REST o CSOM.
Directrices avanzadas
Como regla general, nos gustaría proporcionar las siguientes directrices de alto nivel para crear y configurar colecciones de sitios y subsitios y, a continuación, implementar artefactos, configuraciones y recursos de personalización de marca en ellos.
- El uso de la autenticación de AppOnly no se admite para ninguna operación del servicio de búsqueda.
- Esto se debe al hecho de que el servicio de búsqueda accede al servicio de perfil de usuario para buscar información de perfil de usuario y ups no admite la autenticación de AppOnly.
- Por lo tanto, dado que la relevancia de la búsqueda y otras facetas de búsqueda dependen de un usuario determinado y sus atributos de perfil, el patrón de autenticación AppOnly no funcionará.
Opciones para ejecutar búsquedas con el servicio de búsqueda de SharePoint
Tiene un coupe de opciones para ejecutar búsquedas con el servicio de búsqueda de SharePoint.
- API de CSOM de .NET
- JavaScript CSOM (JSOM) API
- API REST
API de CSOM de .NET
En esta opción se usa la API de CSOM de .Net para ejecutar búsquedas con el servicio de búsqueda de SharePoint.
- Esta API solo está disponible en código .Net administrado.
¿Cuándo es una buena opción?
- Esta API es una excelente opción para complementos hospedados por el proveedor, operaciones de larga duración u otros escenarios del lado servidor que se ejecutan en la plataforma .Net.
- Algunos ejemplos de estos escenarios son ASP.NET sitios web de MVC, servicios de ASP.NET Web API, aplicaciones de Windows o consola de .Net y trabajos web de Azure.
Introducción
En el ejemplo siguiente se muestra cómo ejecutar búsquedas con el servicio de búsqueda de SharePoint con la API de CSOM de .Net. En este ejemplo también se muestra cómo acceder al perfil de un usuario para personalizar los resultados de la búsqueda.
El tutorial How to perform personalized search queries with CSOM (O365 PnP Video) (Cómo realizar consultas de búsqueda personalizadas con CSOM (vídeo PnP de O365) le guiará por el ejemplo Search.PersonalizedResults (ejemplo PnP de O365).
El método btnPerformSearch_Click de la clase Default.aspx.cs ejecuta una búsqueda del valor de texto que el usuario escribe en el cuadro de búsqueda y limita la búsqueda a todo el contenido almacenado en una colección de sitios. El parámetro contentclass:"STS_Site" limita el ámbito de búsqueda a las colecciones de sitios.
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);
}
}
El método btnPersonalizedSearch_Click de la clase Default.aspx.cs ejecuta la misma búsqueda que el método btnPerformSearch_Click y también agrega un parámetro adicional basado en el perfil del usuario actual. La clase PeopleManager se usa para acceder a las propiedades de perfil del usuario actual.
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);
}
}
El método ResolveAdditionalFilter de la clase Default.aspx.cs evalúa las propiedades de perfil del usuario actual y devuelve un parámetro de búsqueda aplicable. En este ejemplo, si la propiedad de perfil de usuario aboutMeValue contiene AppTest, se devuelve el parámetro de búsqueda WebTemplate=STS. Este parámetro limita el ámbito de búsqueda a los sitios creados con la plantilla STS (Sitio de equipo).
private string ResolveAdditionalFilter(string aboutMeValue)
{
if (!aboutMeValue.Contains("AppTest"))
{
return "WebTemplate=STS";
}
return "";
}
En ambos casos, el método ProcessQuery de la clase Default.aspx.cs usa la clase SearchExecutor para ejecutar la consulta de búsqueda y devolver los resultados.
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
En esta opción se usa la API de CSOM de JavaScript (JSOM) para ejecutar búsquedas con el servicio de búsqueda de SharePoint.
- Esta API solo está disponible en código JavaScript del lado cliente.
¿Cuándo es una buena opción?
- Esta API es una excelente opción para complementos hospedados en SharePoint y complementos hospedados por el proveedor que se ejecutan en cualquier plataforma web.
- Algunos ejemplos de estos escenarios son ASP.NET sitios web de MVC, sitios web php, sitios web de Python, etc.
Introducción
En el ejemplo de código siguiente se muestra cómo ejecutar búsquedas con el servicio de búsqueda de SharePoint con la API de CSOM (JSOM) de JavaScript. En este ejemplo se ejecuta una búsqueda de todos los elementos que contienen el término "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 de REST
En esta opción, usará la API REST para ejecutar búsquedas con el servicio de búsqueda de SharePoint.
- Esta API es la más flexible porque está disponible tanto en el lado servidor como en el código del lado cliente.
- El punto de conexión raíz de la API rest de SharePoint Search Service es:
- <https:// tenant>/site/_api/search/query
- Estos son algunos ejemplos sencillos:
Búsqueda de palabras clave
https://tenant/site/_api/search/query?querytext='{Apples}'
Selección de propiedades específicas
https://tenant/site/_api/search/query?querytext='test'&selectproperties='Rank, Title'
Ordenación
https://tenant/site/_api/search/query?querytext='Oranges'&sortlist='LastModifiedTime:ascending'
¿Cuándo es una buena opción?
Esta API es una excelente opción para complementos hospedados en SharePoint y complementos hospedados por el proveedor que se ejecutan en cualquier plataforma web.
- Algunos ejemplos de estos escenarios son ASP.NET sitios web de MVC, sitios web de PHP, sitios web de Python, servicios de ASP.NET Web API, aplicaciones de windows o consola de .Net, trabajos web de Azure, etc.
Introducción
Opción del lado servidor
En el ejemplo siguiente se muestra cómo ejecutar búsquedas con el servicio de búsqueda de SharePoint con la API REST desde código .Net administrado.
EmployeeDirectory (Contenido de entrenamiento de OfficeDev)
El método Index de la clase HomeController.cs ejecuta una búsqueda de todos los usuarios cuyo apellido comienza con el valor de texto en el que hace clic el usuario.
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();
El tutorial How to build SharePoint add-ins that leverage search (O365 PnP Video) le guiará por EmployeeDirectory (Contenido de entrenamiento de OfficeDev).
Opción del lado cliente
En el ejemplo de código siguiente se muestra cómo ejecutar búsquedas con el servicio de búsqueda de SharePoint con la API REST desde JavaScript. En este ejemplo se ejecuta una búsqueda de todos los elementos que contienen el término "Lacrosse".
$.ajax({
url: "http://site/_api/search/" +
"query?querytext='{Lacrosse}‘",
method: "GET",
headers: {
"accept": "application/json;odata=verbose",
},
success: onSuccess,
error: onError
});
Vínculos relacionados
- Cómo realizar consultas de búsqueda personalizadas con CSOM (vídeo PnP de O365)
- EmployeeDirectory (Contenido de entrenamiento de OfficeDev)
- Cómo crear complementos de SharePoint que aprovechen la búsqueda (vídeo PnP de O365)
- Artículos de orientación en https://aka.ms/OfficeDevPnPGuidance
- Referencias en MSDN en https://aka.ms/OfficeDevPnPMSDN
- Vídeos en https://aka.ms/OfficeDevPnPVideos
Ejemplos de PnP
- Search.PersonalizedResults (ejemplo PnP de O365)
- Ejemplos y contenido en Patrones y prácticas de Microsoft 365 (PnP)
Se aplica a
- Office 365 multiempresa (MT)
- Office 365 dedicado (D)
- SharePoint 2013 local