13.3.4. Requêtes de facette


La recherche en facette est une technique permet de diviser les résultats d'une requête en plusieurs catégories. Cette catégorisation inclut le calcul du nombre de clics pour chaque catégorie et la capacité de restreindre les résultats de la recherche sur la base de ces facettes (catégories). Exemple 13.50, « Recherche Hibernate Search sur Amazon » montre un exemple de facette. La recherche renvoie quinze résultats affichés sur la partie principale de la page. La barre de navigation sur la gauche, cependant, montre la catégorie Computers & Internet avec ses sous-catégories Programming, Computer Science, Databases, Software, Web Development, Networking et Home Computing. Pour chacune de ces sous-catégories, le nombre de livres correspondant au critère de recherche principal et appartenant à la sous-catégorie respective est affiché. Cette division de la catégorie Computers & Internet est une facette de rechercher concrète.

Exemple 13.50. Recherche Hibernate Search sur Amazon

Dans Hibernate Search, les classes QueryBuilder et FullTextQuery sont le point d'entrée dans l'API de facette. Le premier crée des requêtes de facettes et le dernier accède à la classe FacetManager. Le FacetManager applique des requêtes de facette sur une requête et sélectionne des facettes ajoutées à une requête existante pour affiner les résultats de la recherche. Les exemples utilisent l'entité Cd tel que démontré dans Exemple 13.51, « Entité Cd »:

Figure 13.1. Recherche Hibernate Search sur Amazon

Exemple 13.51. Entité Cd

@Indexed
public class Cd {

    private int id;

    @Fields( {
        @Field,
        @Field(name = "name_un_analyzed", analyze = Analyze.NO)
    })
    private String name;

    @Field(analyze = Analyze.NO)
    @NumericField
    private int price;

    Field(analyze = Analyze.NO)
    @DateBridge(resolution = Resolution.YEAR)
    private Date releaseYear;

    @Field(analyze = Analyze.NO)
    private String label;


// setter/getter
...
Copy to Clipboard Toggle word wrap

13.3.4.1. Création d'une requête de facette

La première étape vers une recherche de facette consiste à créer la FacetingRequest. Deux types de requête de facette sont pour l'instant pris en charge. Le premier type s'intitule « discrete faceting » (requête de facette discrète) et le second « range faceting » (requête de facette de gamme). Dans le cas d'une requête de facette discrète, vous devez spécifier le champ d'index sur lequel vous souhaitez effectuer la requête de facette (catégoriser) et les options de requête de facette à appliquer. Vous trouverez un exemple de requête de facette discrète dans Exemple 13.52, « Création d'une requête de facette discrète »:

Exemple 13.52. Création d'une requête de facette discrète

QueryBuilder builder = fullTextSession.getSearchFactory()
    .buildQueryBuilder()
        .forEntity( Cd.class )
            .get();
FacetingRequest labelFacetingRequest = builder.facet()
    .name( "labelFaceting" )
    .onField( "label")
    .discrete()
    .orderedBy( FacetSortOrder.COUNT_DESC )
    .includeZeroCounts( false )
    .maxFacetCount( 1 )
    .createFacetingRequest();
Copy to Clipboard Toggle word wrap
Lors de l'exécution de cette requête de facette, une instance Facet sera créée pour chaque valeur discrète pour le champ indexé label. L'instance Facet enregistrera la valeur de champ réelle en incluant la fréquence à laquelle cette valeur de champ apparaît dans les résultats de requête initiaux. orderedBy, includeZeroCounts et maxFacetCount sont des paramètres facultatifs pouvant être appliqués sur toute requête de facette. orderedBy permet de spécifier l'ordre dans lequel les facettes créées seront renvoyées. La valeur par défaut est FacetSortOrder.COUNT_DESC, mais vous pouvez également trier par valeur de champ ou par l'ordre dans lequel les gammes sont spécifiées. La méthode includeZeroCount détermine si les facettes avec un résultat de 0 seront incluses dans le résultat (elles le seront par défaut) et la méthode maxFacetCount vous permet de limiter le nombre maximal de facettes renvoyées.

Note

Un champ indexé doit remplir plusieurs conditions préalables afin d'appliquer des requêtes de facette. La propriété indexée doit être de type String, Date ou un sous-type des valeurs Number et null doivent être évitées. De plus, la propriété doit être indexée avec Analyze.NO et en cas de propriété numérique la classe @NumericField doit être spécifiée.
La création d'une requête de facette de gamme est similaire, à l'exception qu'il faut préciser les gammes pour les valeurs de champ sur lesquelles les requêtes de facette sont effectuées. Une requête de facette de gamme se trouve dans l'Exemple 13.53, « Création d'une requête de facette de gamme » où trois gammes de prix différentes sont indiquées. below et above ne peuvent être spécifiées qu'une fois, mais vous pouvez spécifier autant de from - to que vous le souhaitez. Pour chaque limite de gamme, vous pouvez également spécifier avec excludeLimit si elle est incluse dans la gamme ou non.

Exemple 13.53. Création d'une requête de facette de gamme

QueryBuilder builder = fullTextSession.getSearchFactory()
    .buildQueryBuilder()
        .forEntity( Cd.class )
            .get();
FacetingRequest priceFacetingRequest = builder.facet()
    .name( "priceFaceting" )
    .onField( "price" )
    .range()
    .below( 1000 )
    .from( 1001 ).to( 1500 )
    .above( 1500 ).excludeLimit()
    .createFacetingRequest();
Copy to Clipboard Toggle word wrap
Retour au début
Red Hat logoGithubredditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance. Découvrez nos récentes mises à jour.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez le Blog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

Theme

© 2025 Red Hat