Trier les résultats de la requête de recherche

Amy Unruh, Octobre 2012
Relations Google Developer

Présentation

Dans cette leçon, vous allez apprendre à trier les résultats d'une requête de recherche dans l'ordre de votre choix :

  • Vous pouvez effectuer un tri sur une valeur de champ ou des expressions qui l'incluent.
  • Vous pouvez effectuer un tri sur un score en fonction du classement de la fréquence du document, ou utiliser ce score dans une expression de classement plus complexe.
  • Les tris peuvent être multidimensionnels. Vous pouvez d'abord effectuer un tri principal sur une expression de champ, puis un tri secondaire, et ainsi de suite.

L'exemple d'application permet à l'utilisateur de trier la mesure de pertinence ou de trier des champs de document de manière bidimensionnelle.

Objectifs

Apprendre à trier les résultats d'une requête de recherche de l'API Search.

Prérequis

Avoir suivi le cours qui précède celui-ci : Premiers pas avec l'API Python Search.

Nous vous recommandons en outre d'effectuer les actions suivantes :

Classe SortOptions

La classe SortOptions constitue la base permettant de définir des ordres de tri pour les résultats de la requête. Une fois défini, le champ SortOptions object est utilisé en tant que paramètre sort_options d'un objet QueryOptions :

from google.appengine.api import search

search.QueryOptions(
    sort_options=search.SortOptions(...)
    ...)

Expressions de tri

Vous pouvez transmettre au constructeur SortOptions un argument expressions, qui est un itérable d'objets SortExpression. Cette action vous permet d'effectuer un tri multidimensionnel basé sur les valeurs des champs du document.

Dans la classe docs.Product de l'exemple d'application, une liste semblable à celle-ci s'affiche :

_SORT_OPTIONS = [
    [AVG_RATING, 'average rating', search.SortExpression(
        expression=AVG_RATING,
        direction=search.SortExpression.DESCENDING, default_value=0)],
    [PRICE, 'price', search.SortExpression(
        expression=PRICE,
        direction=search.SortExpression.ASCENDING, default_value=9999)],
    [UPDATED, 'modified', search.SortExpression(
        expression=UPDATED,
        direction=search.SortExpression.DESCENDING, default_value=1)],
    [CATEGORY, 'category', search.SortExpression(
        expression=CATEGORY,
        direction=search.SortExpression.ASCENDING, default_value='')],
    [PRODUCT_NAME, 'product name', search.SortExpression(
        expression=PRODUCT_NAME,
        direction=search.SortExpression.ASCENDING, default_value='zzz')]
  ]

Cette liste définit un objet SortExpression pour un sous-ensemble de champs de document produit. Dans chaque définition, le paramètre expression correspond simplement au nom du champ. Vous verrez par la suite d'autres variantes d'expression. Notez que chaque expression de tri définit un sens de tri (ASCENDING ou DESCENDING) et une valeur par défaut, utilisée si un document n'inclut pas le champ donné dans l'expression.

Dans le champ handlers.py, la méthode ProductSearchHandler.doProductSearch() se sert de ces définitions pour spécifier un tri bidimensionnel, en définissant une liste triée d'objets SortExpression et en transmettant cette liste en tant que paramètre expressions du constructeur SortOptions. Si l'utilisateur demande un tri par note moyenne, effectuez un tri secondaire par prix :

sortopts = search.SortOptions(expressions=[
    search.SortExpression(expression=docs.Product.AVG_RATING, direction='DESCENDING', default_value=0),
    search.SortExpression(expression=docs.Product.PRICE, direction='ASCENDING', default_value=9999)])

Sinon (par exemple, si l'utilisateur demande un tri par prix), le tri secondaire s'effectue par note moyenne :

sortopts = search.SortOptions(expressions=[
    search.SortExpression(expression=docs.Product.PRICE, direction='ASCENDING', default_value=9999),
    search.SortExpression(expression=docs.Product.AVG_RATING, direction='DESCENDING', default_value=0)])

Ensuite, comme précédemment, transmettez cet objet au constructeur QueryOptions :

search.QueryOptions(
    sort_options=sortopts
    ...)

Utiliser les fonctions d'expression dans une expression de tri

La propriété expression d'un objet SortExpression peut constituer plus qu'un simple nom de champ. Vous pouvez également utiliser les fonctions d'expression (telles que max) mentionnées dans la leçon précédente. Par exemple, l'expression de tri suivante effectue le tri en fonction de la valeur du champ price, qui a été ajustée pour inclure la taxe de vente :

search.SortExpression(
    expression='price * 1.08',
    direction=search.SortExpression.ASCENDING, default_value=9999)]

Trier les champs GeoPoint par distance

Il est intéressant de pouvoir trouver tous les magasins situés dans un périmètre donné, mais il est encore mieux de pouvoir les trier en fonction de leur distance. Pour ce faire, il suffit d'ajouter une expression de tri à l'aide de la fonction distance intégrée. La requête suivante recherche tous les magasins situés à moins de 4,5 kilomètres de l'emplacement de l'utilisateur et les trie par ordre croissant, du plus proche au plus éloigné :

index = search.Index(config.STORE_INDEX_NAME)
user_location = (-33.857, 151.215)
query = "distance(store_location, geopoint(%f, %f)) < %f" % (
    user_location[0], user_location[1], 45000)
loc_expr = "distance(store_location, geopoint(%f, %f))" % (
    user_location[0], user_location[1])
sortexpr = search.SortExpression(
    expression=loc_expr,
    direction=search.SortExpression.ASCENDING, default_value=45001)
search_query = search.Query(
    query_string=query,
    options=search.QueryOptions(
        sort_options=search.SortOptions(expressions=[sortexpr])))
results = index.search(search_query)

Attribuer des scores de correspondance

La classe MatchScorer permet de trier les documents par ordre croissant, à l'aide d'un score basé sur la fréquence des termes. Un objet MatchScorer est transmis en tant que paramètre match_scorer au constructeur SortOptions :

sortopts = search.SortOptions(match_scorer=search.MatchScorer())
search.QueryOptions(
    sort_options=sortopts
    ...)

L'exemple d'application utilise ce type de tri lorsque l'utilisateur sélectionne la pertinence dans le menu de tri des requêtes de l'interface utilisateur.

Vous pouvez également accéder au score d'un document dans une expression de tri, à l'aide du nom de champ spécial _score. Dans ce cas, votre objet SortOptions doit inclure un marqueur "scorer". Exemple :

search.SortOptions(match_scorer=search.MatchScorer(),
    expressions=[search.SortExpression(...),...])

Résumé et vérification

Dans cette leçon, vous avez appris à définir des tris multidimensionnels sur les résultats de recherche en spécifiant les objets SortExpression et MatchScorer, puis en les exploitant pour générer l'objet SortOptions, transmis au constructeur QueryOptions.

Continuez à tester les expressions de tri pour vous assurer d'avoir compris leur fonctionnement. Par exemple, essayez de modifier les dimensions de tri définies par les objets SortOptions dans ProductSearchHandler.doProductSearch(), en effectuant un tri secondaire sur une autre dimension. Vous pouvez également essayer de modifier le sens de tri pour l'une des dimensions du tri.

Dans la prochaine leçon, vous allez apprendre à récupérer, supprimer et réindexer les documents de l'API Search.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Python sur App Engine