Tri des résultats de recherche dans SharePoint

Rubrique de présentation conceptuelle

Triez les résultats de la recherche via un programme (par rang, par valeur de propriété gérée, en fonction d’une expression de formule ou dans un ordre aléatoire) à l’aide du modèle objet de requête dans SharePoint.

Vous pouvez trier les résultats d’une recherche SharePoint de quatre façons différentes :

Cet article vous explique comment trier les résultats de la recherche via un programme. Pour savoir comment trier les résultats de la recherche en employant les règles de requête SharePoint, consultez les articles suivants :

Définition du tri dans une requête

Lorsque vous utilisez le modèle objet Query, vous pouvez choisir les critères de tri en fournissant une spécification de tri via la propriété SortList de la classe KeywordQuery . La propriété SortList est du type SortCollection, ce qui représente une collection d’objets Sort.

Un objet Sort définit un moyen de trier les résultats de la recherche ; il se compose d’une valeur sur laquelle vous souhaitez classer les résultats de la recherche (Propriété) et d’une direction dans laquelle vous souhaitez classer les résultats (Direction). Le sens est du type SortDirection() et peut être croissant ou décroissant.

Si vous avez plusieurs valeurs dans SortList, le tri est effectué en fonction de la séquence dans laquelle les valeurs apparaissent. Chaque objet Sort représente ainsi un niveau d’ordre de tri. Les niveaux suivants éventuels ne modifient pas l‘ordre des résultats différenciés par les précédents, mais peuvent affecter l’ordre interne des résultats présentant les mêmes valeurs de tri aux niveaux précédents.

Outre le modèle objet de requête, SharePoint propose également un service REST de recherche que vous pouvez utiliser pour interroger l’index de recherche avec votre client ou des applications mobiles. Le service REST de recherche prend en charge les requêtes HTTP POST et GET. Pour plus d’informations sur la construction d’URI pour ces demandes, voir Requêtes avec le service REST de recherche.

Trier les résultats de recherche par rang

Par défaut, les résultats de la recherche sont triés selon le classement effectué en fonction de la pertinence. Autrement dit, SharePoint place les résultats les plus pertinents en premier dans le jeu de résultats de la recherche. Si vous triez les résultats par rang, les résultats sont toujours triés dans l’ordre décroissant. Mais vous pouvez modifier l’ordre de tri en ordre croissant à l’aide de SortDirection().

Vous pouvez également influer sur le calcul du classement dans la chaîne de requête de deux manières :

Trier les résultats de la recherche par valeur de propriété gérée

Vous pouvez trier les résultats de la recherche selon la valeur d’une ou de plusieurs propriétés gérées. Autrement dit, SharePoint effectue le tri en fonction des résultats qui correspondent à la requête.

Vous pouvez procéder au tri sur la base des propriétés de texte et numériques. Pour les propriétés de texte, le tri est basé sur le tri standard des chaînes de texte. En revanche, pour les propriétés numériques (y compris les propriétés gérées de type DateTime), le tri est basé sur la valeur numérique.

Exemple

L'exemple suivant décrit comment trier les résultats de la recherche à l'aide de la propriété gérée 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"]);
    }
}

Sinon, vous pouvez utiliser l'API REST de recherche pour trier les résultats de la recherche à l'aide de la propriété Size avec l'appel suivant.


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

Trier les résultats de la recherche en fonction d’une expression de formule

Vous pouvez indiquer un tri des résultats de la recherche basé sur une spécification de tri qui utilise une formule mathématique afin de créer la valeur de tri.

La fonctionnalité de tri par formule est une extension de la fonctionnalité de tri à niveau unique et à plusieurs niveaux pour les résultats de la recherche. Cette fonctionnalité vous permet de spécifier une formule au lieu d'une propriété gérée en tant que critère de tri.

À l'aide de la fonctionnalité de tri par formule, vous pouvez appliquer des opérations mathématiques sur la valeur d'une ou de plusieurs propriétés gérées pour chaque élément dans les résultats de la requête.

Voici des exemples qui peuvent être implémentés à l'aide d'une formule pour spécifier un tri des résultats de la recherche :

  • Algorithme voisin le plus proche de K pour classer des documents.

  • Distance euclidienne ou distance de Manhattan pour calculer les distances géographiques.

  • Valeur préférée, par exemple, pour trier les documents en fonction de l'écart entre une valeur de propriété gérée donnée et une valeur préférée.

La fonctionnalité de tri par formule n'inclut pas le contrôle de paramètres de classement dynamique statistique, tels que la fréquence ou la proximité d'un terme.

La formule est évaluée de gauche à droite et utilise la priorité d'opérateur mathématique standard. Autrement dit, les fonctions et les groupes entre parenthèses sont évalués en premier, les opérations de multiplication et de division sont réalisées en deuxième, puis les additions et soustractions sont effectuées en dernier.

Importante

Le résultat final d’une formule doit être compris dans la plage de valeurs d’un entier signé 32 bits. Dans le cas contraire, il est possible que le tri soit incorrect.

Spécifier la formule de tri dans une requête

Vous spécifiez une formule de tri au lieu d'une propriété gérée dans la spécification de tri de la requête.

La spécification de tri a le format suivant : [formula:<sort-formula>]

Dans le format, <sort-formula> est l’expression de formule de tri.

Remarque

Les crochets font partie de la syntaxe de spécification de tri.

Le sens du tri par défaut est décroissant. Vous pouvez également utiliser une formule qui trie les résultats par ordre croissant, par exemple dans le cas où la formule indique une distance géographique.

L'exemple de code suivant montre comment spécifier un tri en fonction d'une formule par ordre croissant à l'aide du modèle objet de requête.

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"]);
    }
}

Sinon, vous pouvez utiliser l'API REST de recherche pour trier les résultats de la recherche à l'aide de la propriété Size avec l'appel suivant.


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

Utilisation des propriétés gérées dans la formule de tri

Vous pouvez appliquer une formule de tri sur la valeur des propriétés gérées de type Integer, Decimal et Datetime(). Vous devez activer le tri pour la propriété gérée spécifiée dans le schéma de recherche.

Pour les propriétés managées de type Decimal, la valeur est multipliée par 10^(chiffres décimaux) avant d’être utilisée dans l’évaluation de formule.

Pour les propriétés managées de type Datetime()](/previous-versions/office/developer/sharepoint-2010/ms500214(v%3Doffice.14)), la valeur est convertie en nombre de 100 nanosecondes depuis le 1er janvier 29000 avant d’être utilisée dans l’évaluation de formule. Une année comporte 366 jours.

Expressions de formule de tri

Le tableau 1 répertorie les fonctions que vous pouvez utiliser dans l'expression de la formule de tri. L'expression ne doit pas contenir d'espaces.

Tableau 1. Fonctions pour les expressions de formule de tri

Fonction Description
+
Indique l'addition.
-
Indique la soustraction.
*
Indique la multiplication.
/
Indique la division.
Remarque : par défaut, une division par zéro entraîne une exception et la requête est renvoyée avec une erreur. Avec l’opérateur errtolast, vous pouvez éviter l’erreur de la requête et placer les éléments ayant échoué à la fin du jeu de résultats.
rank
Mot clé spécial qui représente le classement dynamique d'un élément.
Exemple : abs(rank-100) utilise la distance par rapport à la valeur de classement 100 comme critère de tri.
[0-9.]+
Indique que les nombres peuvent être affectés en tant que valeurs entières ou doubles.
Exemples : 503, 3,14 ou 5,4352262
[a-z0-9]+]
Indique que n'importe quelle séquence de caractères non reconnue en tant que nom de fonction est considérée comme un nom de propriété gérée. Vous devez activer le tri pour la propriété gérée spécifiée dans le schéma de recherche.
Exemple : vous pouvez définir une propriété gérée nommée height avec le tri activé. Cela vous permet d'utiliser « height » comme une expression dans la formule. Celle-ci utilise la valeur de la propriété gérée height.
( and )
Fonction utilisée pour grouper les calculs afin d'assurer une priorité correcte.
Exemple : 4*(3+2)
sqrt(n)
Racine carrée de n.
exp(n)
Fonction exponentielle équivalent à puissance(2,71828182846,n)
log(n)
Logarithme naturel de n.
abs(n)
Valeur absolue de n.
ceil(n)
Plafond de n. Autrement dit, si n n’est pas un nombre entier, arrondissez au nombre entier suivant. Si n est un nombre entier, utilisez n.
floor(n)
Le plancher de n. Autrement dit, si n n’est pas un nombre entier, arrondissez au nombre entier suivant. Si n est un nombre entier, utilisez n.
round(n)
Arrondi de n au nombre entier pair le plus proche. Également appelé « arrondi des banquiers » ou « arrondi de moitié à pair ».
sin(n)
Sinus de n radians.
cos(n)
Cosinus de n radians.
tan(n)
Tangente de n radians.
asin(n)
Arcsinus, en radians, de n.
acos(n)
Arccosin, en radians, de n.
atan(n)
Arctangente, en radians, de n.
pow(x,y)
Valeur de x élevée à la puissance de y.
Remarque : la valeur de y doit être un nombre réel.
atan2(y,x)
Arc tangente à deux arguments de l'angle exprimé en radians, entre l'axe des abscisses positif et l'axe des coordonnées cartésien indiqué (x, y).
bucket(b,n1,n2,…)
Opérateur pouvant être utilisé pour fournir des valeurs distinctes pour des plages de distribution de valeur données pour une expression.
L’expression b peut être une propriété gérée ou toute autre expression de formule. Les arguments n1, n2, ... représentent des seuils numériques. Vous pouvez spécifier un nombre arbitraire de seuils de compartiments.
Remarque : Vous devez organiser les arguments n1, n2, n3, ... dans l’ordre suivant : n1 < n2 < n3 < ... avec n1 >= 0. Une valeur donnée pour l’expression d’entrée b est arrondie au seuil numérique inférieur le plus proche fourni. Si elle est inférieure au seuil le plus bas donné, la valeur sortante est zéro.
errtolast(x)
Opérateur qui permet de contrôler le mode de gestion des exceptions de formule ; x peut représenter n’importe quelle expression de formule. Si le calcul de cette expression de formule aboutit à une exception mathématique pour un élément du jeu de résultats, par exemple une division par zéro, les éléments de ce type s’affichent à la fin de la liste de tri, indépendamment du sens de tri spécifié.

Caractéristiques de performances pour le tri par formule

L'utilisation d'une formule de tri implique que les calculs de formule soient appliqués à tous les éléments correspondants dans le jeu de résultats. Cela signifie que l'impact des performances de requête dépend du nombre d'éléments qui correspondent à la requête.

Les formules longues comportant de nombreux opérateurs nécessitent plus de temps de traitement que les formules courtes.

Utilisation du tri par formule pour les distances géographiques

Vous pouvez utiliser le tri par formule pour appliquer un classement en fonction de la distance. Pour ce faire, vous devez inclure des propriétés gérées qui représentent la latitude et la longitude de chaque élément.

Par exemple, vous pouvez utiliser l'une des formules standard suivantes :

  • Distance de Manhattan

  • Distance euclidienne (voir exemple 2)

  • Formule de Haversine

Importante

Utilisez des propriétés gérées de type Decimal ou Float pour représenter les valeurs de latitude et de longitude.

Exemples

Les exemples suivants montrent comment spécifier la formule de tri à l'aide du modèle objet de requête.

Exemple 1. Placez les éléments dont la propriété gérée height est la plus proche de 20 en haut de la liste des résultats.


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"]);
    }
}

Vous pouvez aussi utiliser l'API REST de recherche pour placer les éléments dont la propriété gérée height est la plus proche de 20 en haut de la liste des résultats, à l'aide de l'appel suivant.


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

Exemple 2. Triez par véritable distance euclidienne 3D à partir d'une position donnée (par exemple la position de l'utilisateur) en fonction des informations de position fournies dans les propriétés gérées latitude, longitude et height. La formule suivante indique la distance euclidienne 3D, car la position de base est 50/100/200 (latitude, longitude, altitude).

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

Si vous souhaitez appliquer un tri basé sur la distance (sans combiner la distance avec d’autres paramètres dans une formule), vous pouvez supprimer le sqrt() composant, car il ne modifie pas la séquence de tri, mais améliore les performances de la requête.

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"]);
    }
}

Exemple 3. Arrondissez les valeurs de taille en compartiments, en arrondissant les valeurs à l’une des valeurs suivantes : 0, 5, 15, 50, 100 ; triez d’abord avec les plus grandes valeurs.


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"]);
    }
}

Trier les résultats de la recherche dans un ordre aléatoire

Vous pouvez appliquer un tri aléatoire aux résultats de la requête, ou ajouter un composant aléatoire pour le tri des résultats.

La spécification de tri aléatoire a le format suivant : [random:seed=<seed>:hashfield=<managed property>]

Remarque

Les crochets font partie de la syntaxe de spécification de tri.

Le Tableau 2 décrit les paramètres pour spécifier le tri aléatoire.

Tableau 2. Paramètres pour la spécification de tri aléatoire

Paramètre Description Obligatoire
Seed
Valeur de départ pour la génération de la valeur aléatoire.
La valeur de départ est une entrée de la fonction qui génère un nombre aléatoire. Ce nombre aléatoire est utilisé dans le tri final. L’utilisation de l’option seed uniquement vous donne un jeu de résultats de requête trié de manière aléatoire. L’ordre de tri pour la même requête (avec utilisation de la même valeur de départ) peut être modifiée après la mise à jour d’un index.
Oui
Hashfield
Propriété gérée qui est utilisée en tant que valeur de hachage pour la génération aléatoire. Vous pouvez utiliser ce paramètre pour vous assurer que l'ordre de tri pour la même requête (lorsque vous utilisez la même valeur de départ) n'est pas modifié après une mise à jour de l'index.
La propriété managée doit être de type Integer et doit être Sortable(). Vous pouvez remplir cette propriété gérée avec des valeurs aléatoires ou uniques (par exemple, un numéro de séquence rempli par une étape de traitement d’élément).
Non

En fournissant la même valeur de départ pour des requêtes identiques, les éléments se présentent dans le même ordre. Cela vous permet de conserver le même ordre aléatoire lors de la pagination des résultats de la recherche. Utilisez le paramètre hashfield si vous souhaitez conserver le même ordre aléatoire lorsqu’une mise à jour de l’index survient accidentellement entre les requêtes.

Exemples

Les exemples suivants montrent comment spécifier un tri aléatoire à l'aide du modèle objet de requête.

Exemple 1. Triez l'ensemble du jeu de résultats dans un ordre aléatoire.


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"]);
    }
}

Sinon, vous pouvez utiliser l'API REST de recherche pour trier l'ensemble du jeu de résultats dans un ordre aléatoire, à l'aide de l'appel suivant.


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

Exemple 2. Triez l'ensemble du jeu de résultats dans un ordre aléatoire. Conservez la même séquence aléatoire pour la même requête avec la même valeur de départ, même en cas de basculement de l'index. Une propriété gérée personnalisée appelée hashvalue doit être disponible dans le schéma de recherche et remplie avec des valeurs numériques aléatoires ou séquentielles pour tous les éléments indexés.

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"]);
    }
}

Voir aussi