Compartir a través de


Ordenar los resultados de búsqueda en SharePoint

Tema de información general conceptual

Ordenar resultados de búsqueda mediante programación (por clasificación, por el valor de la propiedad administrada, por una expresión de fórmula o aleatoriamente) mediante el uso del modelo de objetos de consulta en SharePoint.

Puede ordenar los resultados de búsqueda de SharePoint de cuatro formas distintas:

Este artículo se centra en ordenar los resultados de búsqueda mediante programación. Para obtener información sobre cómo ordenar los resultados de búsqueda mediante reglas de consulta de SharePoint, vea los artículos siguientes:

Especificación del criterio de ordenación en una solicitud de consulta

Cuando se usa el modelo de objetos Query, puede elegir los criterios de ordenación proporcionando una especificación de ordenación a través de la propiedad SortList de la clase KeywordQuery . La propiedad SortList es de tipo SortCollection, que representa una colección de objetos Sort.

Un objeto Sort define una manera de ordenar los resultados de la búsqueda; consta de un valor en el que desea ordenar los resultados de búsqueda (Propiedad) y una dirección en la que desea ordenar los resultados (Dirección). La dirección es de tipo SortDirection() y puede ser ascendente o descendente.

Si tiene varios valores en SortList, la ordenación se realiza en función de la secuencia en la que aparecen los valores. Esto significa que todos los objetos Sort representan un nivel de criterio de ordenación. Los niveles sucesivos no cambian el orden de los resultados especificado en los anteriores, pero puede afectar a la ordenación interna de resultados que tengan los mismos valores de orden que los niveles anteriores.

Aparte del modelo de objetos de consulta, SharePoint también proporciona un servicio de REST de búsqueda que puede usar para consultar el índice de búsqueda con el cliente o aplicaciones móviles. El servicio REST de búsqueda admite tanto solicitudes POST HTTP como GET HTTP. Para obtener más información sobre cómo crear URI para estas solicitudes, consulte Consulta con el servicio REST de búsqueda.

Ordenar resultados de búsqueda por clasificación

De forma predeterminada, los resultados de búsqueda se ordenan por relevancia. Esto significa que SharePoint coloca los resultados más relevantes en la parte superior del conjunto de resultados de búsqueda. Si ordena por clasificación, los resultados siempre se ordenarán en orden descendente. Pero puede cambiar el criterio de ordenación a ascendente mediante SortDirection().

También puede influir en el cálculo de la clasificación en la cadena de consulta de dos maneras:

Ordenar resultados de búsqueda por el valor de la propiedad administrada

Puede especificar el orden de los resultados de búsqueda en función del valor de una o más propiedades administradas. Esto significa que SharePoint realiza la ordenación en función de todos los resultados que coinciden con la consulta.

Puede ordenar en función de las propiedades de texto y numéricas. Para las propiedades de texto, la ordenación se basa en el orden de cadenas de texto estándar. En cambio, para las propiedades numéricas (incluidas las propiedades administradas de tipo DateTime), la ordenación se basa en un valor numérico.

Ejemplo

En el ejemplo siguiente se muestra cómo ordenar los resultados de búsqueda mediante el uso de la propiedad administrada Size.


using (var context = new ClientContext("http://localhost"))
{
    var query = new KeywordQuery(context)
    {
        QueryText = "home"
    };
    query.SortList.Add("Size", SortDirection.Descending);

    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);

    context.ExecuteQuery();

    foreach (var result in results.Value[0].ResultRows)
    { 
        Console.WriteLine(result["Title"] + " Size:" + result["Size"]);
    }
}

Como alternativa, puede usar la API de REST de búsqueda para ordenar los resultados de búsqueda mediante el uso de la propiedad Size con la siguiente llamada.


http://localhost/_api/search/query?querytext='home'&sortlist='size:descending'

Ordenar resultados de búsqueda por una expresión de fórmula

Puede especificar la ordenación de los resultados de una consulta mediante un criterio basado en una fórmula matemática que crea el valor de la ordenación.

La ordenación por fórmula característica es una extensión de la solo nivel y de varios niveles de ordenación funcionalidad para los resultados de búsqueda. La característica permite especificar una fórmula en lugar de una propiedad administrada como criterios de ordenación.

Mediante el uso de la característica de ordenación por fórmula se pueden aplicar operaciones matemáticas al valor de una o varias propiedades administradas para cada elemento de los resultados de la consulta.

Los siguientes son ejemplos que se pueden implementar mediante una fórmula para especificar la ordenación de resultados de búsqueda:

  • Algoritmo K de vecino más cercano para clasificar los documentos.

  • Distancia euclidiana o distancia de Manhattan para calcular distancias geográficas.

  • Valor preferido, por ejemplo, para ordenar los documentos en función de cuánto se aleja el valor de la propiedad administrada determinada del valor preferido.

La característica de ordenación por fórmula no incluye el control de parámetros de clasificación dinámicos estadísticos, como la frecuencia del término y la proximidad.

La fórmula se evalúa de izquierda a derecha y usa la precedencia de los operadores matemáticos estándar. Es decir, primero se evalúan las funciones y los grupos entre paréntesis, después las operaciones de multiplicación y división y, por último, las operaciones de suma y resta.

Importante

[!IMPORTANTE] El resultado final de una fórmula debe estar en el intervalo de valores de un entero con signo de 32 bits. De lo contrario, la ordenación puede ser incorrecta.

Especificación de la fórmula de ordenación en una consulta

Se especifica una fórmula de ordenación en lugar de una propiedad administrada en el criterio de ordenación de la solicitud de consulta.

La especificación de ordenación tiene el siguiente formato: [formula:<sort-formula>]

En el formato, <sort-formula> es la expresión de fórmula de ordenación.

Nota:

Los corchetes forman parte de la sintaxis de la especificación de orden.

La dirección de ordenación predeterminado es descendente. También se puede usar una fórmula que se ordena por orden ascendente de valor, por ejemplo, si la fórmula especifica una distancia geográfica.

En el ejemplo de código siguiente se muestra cómo especificar una ordenación por fórmula con orden ascendente mediante el modelo de objeto de consulta.

using (var context = new ClientContext("http://localhost"))
{
    var query = new KeywordQuery(context)
    {
        QueryText = "home"
    };
    query.SortList.Add("[formula:abs(2000-size)]", SortDirection.Ascending);

    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);

    context.ExecuteQuery();

    foreach (var result in results.Value[0].ResultRows)
    { 
        Console.WriteLine(result["Title"]);
    }
}

Como alternativa, puede usar la API de REST de búsqueda para ordenar los resultados de búsqueda mediante el uso de la propiedad Size con la siguiente llamada.


http://localhost/_api/search/query?querytext='home'&amp;sortlist='[formula:abs(2000-size)]:ascending'

Utilizar propiedades administradas en la fórmula de ordenación

Puede aplicar una fórmula de ordenación en el valor de las propiedades administradas de tipo Integer, Decimal y Datetime(). Debe habilitar la ordenación de la propiedad administrada especificada en el esquema de búsqueda.

Para las propiedades más administradas de tipo Decimal, el valor se multiplica por 10^(dígitos decimales) antes de usarse en la evaluación de fórmulas.

Para las propiedades administradas de tipo Datetime()](/previous-versions/office/developer/sharepoint-2010/ms500214(v%3Doffice.14)), el valor se convierte al número de 100 nanosegundos desde el 1 de enero de 29000 ANTES de usarse en la evaluación de fórmulas. El año tiene 366 días.

Expresión de fórmulas de ordenación

La tabla 1 se enumeran las funciones que puede utilizar en la expresión de fórmula de ordenación. La expresión no debe contener espacios.

Tabla 1. Funciones para las expresiones de fórmulas de ordenación

Función Descripción
+
Especifica suma.
-
Especifica resta.
*
Especifica multiplicación.
/
Especifica división.
Nota: De forma predeterminada, una división por cero genera una excepción y la consulta devuelve un error. Al usar el operador errtolast, puede evitar el error de la consulta y, en su lugar, colocar los elementos de error al final del conjunto de resultados.
rank
Una palabra clave especial que representa el rango dinámico de un elemento.
Ejemplo: abs(rank-100) usará la distancia desde el valor de clasificación 100 como criterios de ordenación.
[0-9.]+
Especifica que los números se pueden expresar como enteros o valores dobles.
Ejemplos: 503, 3.14, 5.4352262
[a-z0-9]+]
Especifica que cualquier secuencia de caracteres no reconocida como un nombre de función se trata como un nombre de propiedad administrada. Debe habilitar la ordenación de la propiedad administrada especificada en el esquema de búsqueda.
Ejemplo: Puede definir una propiedad administrada denominada height con habilitada la ordenación. Esto le permite usar "alto" como una expresión en la fórmula. La fórmula usará el valor de la propiedad height administrado.
( and )
Se usa para agrupar cálculos para garantizar la precedencia correcta.
Ejemplo: 4*(3+2)
sqrt(n)
Raíz cuadrada de n.
exp(n)
Función exponencial equivalente a pow(2.71828182846,n)
log(n)
El logaritmo natural de n.
abs(n)
Valor absoluto de n.
ceil(n)
El techo de n. Es decir, si n no es un número entero, redondee al siguiente número entero. Si n es un número entero, use n.
floor(n)
El piso de n. Es decir, si n no es un número entero, redondee hacia abajo al siguiente número entero. Si n es un número entero, use n.
round(n)
Redondeo de n al número entero par más cercano. También se conoce como "Redondeo bancario" o "Redondeo al par más próximo".
sin(n)
Seno de n radianes.
cos(n)
Coseno de n radianes.
tan(n)
La tangente de n radianes.
asin(n)
Arcoseno, en radianes, de n.
acos(n)
La arccosina, en radianes, de n.
atan(n)
El arcotangente, en radianes, de n.
pow(x,y)
Valor de x elevado a la potencia de y.
Nota: El valor de y debe ser un número real.
atan2(y,x)
Una arcotangente de dos argumentos del ángulo en radianes entre el eje x positivo y la coordenada cartesiana especificada (x, y).
bucket(b,n1,n2,…)
Un operador que se puede usar para proporcionar valores discretos para rangos de distribución de valor determinados de una expresión.
La expresión b puede ser una propiedad administrada o cualquier otra expresión de fórmula. Los argumentos n1, n2, ... representan umbrales numéricos. Puede especificar un número arbitrario de umbrales de cubo.
Nota: Debe organizar los argumentos n1, n2, n3, ... en el orden siguiente: n1 < n2 < n3 < ... con n1 >= 0. Un valor dado para la expresión de entrada b se redondea hacia abajo al umbral numérico más próximo. Si es menor que el umbral más bajo dado, el valor resultante es cero.
errtolast(x)
Operador que se puede usar para controlar cómo controlar las excepciones de fórmula; x puede ser cualquier expresión de fórmula. Si el cálculo de la expresión de esta fórmula da lugar a una excepción matemática para un elemento del conjunto de resultados, como la división por cero, estos elementos aparecen al final de la lista, independientemente de la dirección de ordenación especificada.

Características de rendimiento para ordenar por fórmula

El uso de una fórmula de ordenación implica que los cálculos de la fórmula se aplican a todos los elementos coincidentes en el conjunto de resultados. Esto significa que el impacto del rendimiento de la consulta depende del número de elementos que coincidan con la consulta.

Las fórmulas largas con muchos operadores requieren más tiempo de procesamiento que las fórmulas cortas.

Uso del criterio de ordenación por fórmula para distancia geográfica

Puede usar el criterio de ordenación por fórmula para aplicar una clasificación basada en la distancia. Para ello, deberá incluir propiedades administradas que representen la latitud y longitud de cada elemento.

Por ejemplo, puede usar una de las siguientes fórmulas estándar:

  • Distancia de Manhattan.

  • Distancia euclidiana. Vea el ejemplo 2.

  • Fórmula de Haversine.

Importante

Use las propiedades administradas de tipo Decimal o Float para representar los valores de latitud y longitud.

Ejemplos

Los ejemplos siguientes muestran cómo especificar la fórmula de ordenación mediante el modelo de objetos de consulta.

Ejemplo 1. Colocar los elementos que tienen la propiedad administrada height más cercana al 20 en la parte superior de la lista de resultados.


using (var context = new ClientContext("http://localhost"))
{
    var query = new KeywordQuery(context)
    {
        QueryText = "home"
    };
    query.SortList.Add("[formula:abs(20-height)]", SortDirection.Ascending);

    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);

    context.ExecuteQuery();

    foreach (var result in results.Value[0].ResultRows)
    { 
        Console.WriteLine(result["Title"]);
    }
}

Como alternativa, puede usar la API de REST de búsqueda para colocar los elementos que tienen la propiedad administrada height más cercana a 20 al principio de la lista de resultados, con la siguiente llamada.


http://localhost/_api/search/query?querytext='home'&amp;sortlist='[formula:abs(20-height)]:ascending

Ejemplo 2. Ordenar por true 3D distancia Euclidiana desde una posición determinada (por ejemplo, la posición del usuario) según la información de posición que se proporciona en las propiedades administradas latitude, longitude y height. La fórmula siguiente proporciona la distancia Euclidiana 3D, dado que la posición de base es 50/100/200 (latitud y longitud/alto).

sqrt(pow(50-latitude,2)+pow(100-longitude,2)+pow(200-height,2))

Si desea aplicar una ordenación basada en distancia (no combinando la distancia con otros parámetros de una fórmula), puede quitar el sqrt() componente, ya que no cambia la secuencia de ordenación; pero mejora el rendimiento de la consulta.

using (var context = new ClientContext("http://localhost"))
{
    var query = new KeywordQuery(context)
    {
        QueryText = "home"
    };
    query.SortList.Add("[formula:pow(50-latitude,2)+pow(100-longitude,2)+pow(200-height,2)]", SortDirection.Ascending);

    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);

    context.ExecuteQuery();

    foreach (var result in results.Value[0].ResultRows)
    { 
        Console.WriteLine(result["Title"]);
    }
}

Ejemplo 3. Ida y vuelta los valores de tamaño en depósitos, rounding valores hacia abajo hasta uno de los siguientes: 0, 5, 15, 50 y 100; ordenar primero con valores más grandes.


using (var context = new ClientContext("http://localhost"))
{
    var query = new KeywordQuery(context)
    {
        QueryText = "home"
    };
    query.SortList.Add("[formula:bucket(size,5,15,50,100)]", SortDirection.Ascending);

    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);

    context.ExecuteQuery();

    foreach (var result in results.Value[0].ResultRows)
    { 
        Console.WriteLine(result["Title"]);
    }
}

Ordenar resultados de búsqueda aleatoriamente

Puede aplicar una ordenación aleatoria a los resultados de la consulta o agregar un componente aleatorio a la ordenación de los resultados.

La especificación de ordenación aleatoria tiene el siguiente formato: [random:seed=<seed>:hashfield=<managed property>]

Nota:

Los corchetes forman parte de la sintaxis de la especificación de orden.

En la Tabla 2 se explican los parámetros para la especificación del criterio de ordenación aleatoria.

Tabla 2. Parámetros para la especificación del criterio de ordenación aleatoria

Parámetro Descripción Required
Seed
El valor de inicialización para la generación del valor aleatorio.
El valor de inicialización se introduce en una función que genera un número aleatorio. Este número aleatorio se usa en la ordenación final. El uso de solo la opción de inicialización le proporcionará un conjunto de resultados de consulta ordenados aleatoriamente. La ordenación de la misma consulta (cuando se usa el mismo valor de inicialización) puede cambiar tras una actualización de índice.

Hashfield
Una propiedad administrada que se utiliza como el valor hash para la generación aleatoria. Puede usar este parámetro para asegurarse de que el orden de clasificación para la misma consulta (cuando se usa el mismo valor de inicialización) no cambia después de una actualización del índice.
La propiedad administrada debe ser de tipo Integer y debe ser Sortable(). Esta propiedad administrada se puede rellenar con valores únicos o aleatorios (por ejemplo, un número secuencial con la fase de procesamiento de un elemento).
No

Al proporcionar el mismo valor de inicialización para consultas iguales, los elementos se mostrarán en el mismo orden. De este modo, puede conservar el mismo orden aleatorio al recorrer las páginas de los resultados de búsqueda. Use el parámetro hashfield si desea preservar el mismo orden aleatorio cuando se produzca por error una actualización de índice entre las consultas.

Ejemplos

Los siguientes ejemplos muestran cómo especificar la ordenación aleatoria mediante el modelo de objeto de consulta.

Ejemplo 1. Ordenar los resultados de todo el conjunto en orden aleatorio.


using (var context = new ClientContext("http://localhost"))
{
    var query = new KeywordQuery(context)
    {
        QueryText = "home"
    };
    query.SortList.Add("[random:seed=5432]", SortDirection.Ascending);

    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);

    context.ExecuteQuery();

    foreach (var result in results.Value[0].ResultRows)
    { 
        Console.WriteLine(result["Title"]);
    }
}

Como alternativa, puede usar la API de REST de búsqueda para ordenar el conjunto completo de resultados en orden aleatorio, con la siguiente llamada.


http://localhost/_api/search/query?querytext='home'&amp;sortlist='[random:seed=5432]:ascending

Ejemplo 2. Ordenar los resultados de todo el conjunto en orden aleatorio. Conservar la misma secuencia aleatoria para la misma consulta con el mismo valor de inicialización, incluso si se produce un conmutador de índice. Debe ser una propiedad administrada personalizada denominada hashvalue disponibles en el esquema de búsqueda y se rellenan con los valores numéricos secuenciales o aleatorios para todos los elementos indizados.

using (var context = new ClientContext("http://localhost"))
{
    var query = new KeywordQuery(context)
    {
        QueryText = "home"
    };
    query.SortList.Add("[random:seed=6543:hashfield=hashvalue]", SortDirection.Ascending);

    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);

    context.ExecuteQuery();

    foreach (var result in results.Value[0].ResultRows)
    { 
        Console.WriteLine(result["Title"]);
    }
}

Vea también