Tri des résultats de recherche dans SharePoint
![]()
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 :
Trier les résultats de la recherche par rang : vous permet de trier le résultat de la recherche selon le classement en fonction de la pertinence.
Trier les résultats de la recherche par valeur de propriété gérée : permet de trier les résultats de la recherche en fonction de la valeur d'une ou de plusieurs propriétés gérées.
Trier les résultats de la recherche en fonction d'une expression de formule : permet de trier les résultats de la recherche par une formule spécifiée dans la requête.
Trier les résultats de la recherche dans un ordre aléatoire : permet de trier les résultats de la requête dans un ordre aléatoire ou d'ajouter un composant aléatoire à l'ordre de tri.
Cet article se concentre sur le tri des résultats de recherche par programmation. Pour savoir comment trier les résultats de la recherche à l’aide de 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 de requête, vous pouvez choisir le critère 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 Trier définit une façon de trier les résultats de recherche; il se compose d’une valeur en fonction de laquelle vous souhaitez trier les résultats de recherche (Propriété) et d’un sens dans lequel vous souhaitez trier les résultats (Direction). La direction est de type SortDirection() et peut être croissant ou décroissant.
S’il y a plusieurs valeurs dans SortList, le tri est exécuté en fonction de l’ordre d’apparition des valeurs. 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 des URI pour ces requêtes, voir Interrogation à l’aide du 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. Vous pouvez inverser l’ordre de tri à l’aide de l’énumération SortDirection().
Vous pouvez également influer sur le calcul du classement dans la chaîne de requête de deux manières :
À l'aide de l'opérateur XRANK disponible dans Référence de syntaxe de langage de requête de mot clé (KQL) et Référence de la syntaxe du langage de requête FQL (FAST Query Language). Vous pouvez utiliser XRANK pour appliquer une amélioration de classement conditionnel si une condition de requête spécifique est remplie.
En choisissant une pondération de pertinence pour le classement dynamique. Lorsque vous utilisez FQL, vous pouvez spécifier une pondération de pertinence individuelle pour chaque opérateur STRING.
Trier les résultats de la recherche par valeur de propriété gérée
Vous pouvez spécifier le tri des résultats de recherche en fonction de la valeur d’une ou plusieurs propriétés gérées. Cela signifie que SharePoint effectue le tri en fonction de tous les 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.
Important
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 est au format suivant : [formula:<sort-formula>]
Dans ce format, correspond à l’expression de la formule de tri.
Notes
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'&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 plus de propriétés gérées de type Decimal, la valeur est multipliée par 10^ (décimales) avant d’être utilisée dans l’évaluation de la formule.
Pour les propriétés gérées de type Datetime()](/previous-versions/office/developer/sharepoint-2010/ms500214(v%3Doffice.14)), la valeur est convertie au nombre 100 nanosecondes depuis le 1er janvier 29000 av J.C avant d’être utilisée dans l’évaluation de la formule. Il y a 366 jours dans l’année.
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 à partir de 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 népérien de n. |
| abs(n) |
Valeur absolue de n. |
| ceil(n) |
Plafond de n. Autrement dit, si n n'est pas un nombre entier, il est arrondi au nombre entier suivant. Si n est un nombre entier, utilisez n. |
| floor(n) |
Plancher de n. Autrement dit, si n n'est pas un nombre entier, il est arrondi au nombre entier inférieur. Si n est un nombre entier, utilisez n. |
| round(n) |
Arrondi de n au nombre entier pair le plus proche. Également appelé « arrondi bancaire » ou « arrondi au chiffre pair ». |
| sin(n) |
Sinus de n radians. |
| cos(n) |
Cosinus de n radians. |
| tan(n) |
Tangente de n radians. |
| asin(n) |
Arc sinus, exprimé en radians, de n. |
| acos(n) |
Arc cosinus, exprimé en radians, de n. |
| atan(n) |
Arc tangente, exprimé 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 < ... où n1 >= 0. Une valeur donnée pour l’expression d’entrée b est arrondie au seuil numérique inférieur le plus proche. Si elle est inférieure au seuil le plus bas donné, la valeur sortante est zéro. |
| errtolast(x) |
Un opérateur peut être utilisé pour contrôler la gestion des exceptions de formule. x peut représenter toute expression de formule. Si le calcul de cette expression formule aboutit à une exception mathématique pour un élément du jeu de résultats, comme une division par zéro, ces éléments s'affichent à la fin de la liste de tri, quel que soit l'ordre 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
Important
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'&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 composant sqrt(). Ce dernier ne modifie pas la séquence de tri, mais il améliore les performances des requêtes.
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 unités inférieures suivantes : 0, 5, 15, 50, 100. Effectuez le tri avec les valeurs les plus élevées d'abord.
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.
Le tri aléatoire est indiqué au format suivant : [random:seed=<seed>:hashfield=<managed property>]
Notes
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 saisie dans une fonction qui génère un nombre aléatoire. Ce numéro aléatoire est utilisé lors du tri final. En utilisant uniquement l'option seed, vous obtiendrez un jeu de résultats de requête trié de manière aléatoire. L'ordre de tri pour la même requête (lorsque vous utilisez la même valeur de départ) est susceptible de changer après une mise à jour de l'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é gérée doit être de type [Integer]https://docs.microsoft.com/previous-versions/office/developer/sharepoint-2010/ms500214(v%3Doffice.14)) et ê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'&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"]);
}
}