13.2. Mapper des entités dans la structure de l'index
13.2.1. Mappage d'une entité Copier lienLien copié sur presse-papiers!
13.2.1.1. Mappage de base Copier lienLien copié sur presse-papiers!
- @Indexed
- @Field
- @NumericField
- @Id
13.2.1.1.1. @Indexed Copier lienLien copié sur presse-papiers!
@Indexed (toutes les entités non annotées avec @Indexed seront ignorées par le processus d'indexation) :
Exemple 13.8. Rendre une classe indexable avec @Indexed
@Entity
@Indexed
public class Essay {
...
}
@Entity
@Indexed
public class Essay {
...
}
index de l'annotation @Indexed pour changer le nom par défaut de l'index.
13.2.1.1.2. @Field Copier lienLien copié sur presse-papiers!
@Field déclare une propriété comme indexée et autorise la configuration de plusieurs aspects du procédé d'indexation en définissant un ou plusieurs des attributs suivants :
name: décrit le nom sous lequel la propriété doit être stockée dans le Document Lucene. La valeur par défaut est le nom de propriété (d'après la convention de JavaBeans)store: indique si la propriété est stockée dans l'index Lucene. Vous pouvez stocker la valeurStore.YES(utilise plus d'espace dans l'index mais permet une projection, voir Section 13.3.1.10.5, « Projection »), la stocker de manière compresséeStore.COMPRESS(utilise davantage de CPU), ou refuser tout stockageStore.NO(valeur par défaut). Lorsqu'une propriété est stockée, vous pouvez récupérer sa valeur initiale à partir du document Lucene, indépendamment de l'indexation de l'élément.index: décrit si la propriété est indexée. Les valeurs disponibles sontIndex.NO(aucune indexation, la propriété ne peut être trouvée par une requête),Index.YES(l'élement est indexé et peut être recherché). La valeur par défaut estIndex.YES.Index.NOpeut être utile lorsqu'une propriété n'a pas l'obligation d'être trouvable mais doit être disponible pour une projection.Note
Index.NOen association avecAnalyze.YESouNorms.YESest inutile caranalyzeetnormsrequièrent que la propriété soit indexée.analyze: détermine si la propriété est analysée (Analyze.YES) ou pas (Analyze.NO). La valeur par défaut estAnalyze.YES.Note
Que vous souhaitiez ou non analyser une propriété dépendra de si vous souhaitez rechercher l'élément tel quel, ou par les mots qu'il contient. Il est utile d'analyser un champ de texte, mais peut-être pas un champ de date.Note
Les champs utilisés pour trier ne doivent pas être analysés.norms: décrit si l'information concernant le boosting de temps d'indexation doit être stocké (Norms.YES) ou pas (Norms.NO). Ne pas la stocker peut économiser une large partie de la mémoire, mais aucune information concernant le boosting de temps d'indexation ne sera disponible. La valeur par défaut estNorms.YES.termVector: décrit des collections de paires de fréquence d'un terme. Cet attribut permet de stocker les vecteurs de terme dans les documents au cours de l'indexation. La valeur par défaut estTermVector.NO.Les différentes valeurs de cet attribut sont :Expand Valeur Définition TermVector.YES Stocke les vecteurs de terme de chaque document et crée deux matrices synchronisées, une contenant des termes de document et l'autre contenant la fréquence d'un terme. TermVector.NO Ne pas stocker de vecteurs de terme. TermVector.WITH_OFFSETS Stocke le vecteur de terme et les informations de décalage de jeton. Identique à TermVector.YES mais contient également les informations de position de décalage de démarrage et de fin pour les termes. TermVector.WITH_POSITIONS Stocke le vecteur de terme et les informations de position de jeton. Identique à TermVector.YES mais contient également les positions ordinales de chaque occurrence d'un terme dans un document. TermVector.WITH_POSITION_OFFSETS Stocke le vecteur de terme, la position du jeton et les informations de décalage. Un mélange de YES, WITH_OFFSETS et WITH_POSITIONS. indexNullAs: par défaut, les valeurs nulles sont ignorées et pas indexées. Cependant, l'utilisation deindexNullAsvous permet de spécifier une chaîne qui sera insérée comme jeton pour la valeurnull. Cette valeur est définie par défaut commeField.DO_NOT_INDEX_NULL, indiquant que les valeursnullne devraient pas être indexées. Vous pouvez définir cette valeur commeField.DEFAULT_NULL_TOKENpour indiquer qu'un jetonnullpar défaut doit être utilisé. Ce jetonnullpar défaut peut être spécifié dans la configuration en utilisanthibernate.search.default_null_token. Si cette propriété n'est pas définie et que vous spécifiezField.DEFAULT_NULL_TOKEN, la chaîne "_null_" sera utilisée par défaut.Note
Lorsque le paramètreindexNullAsest utilisé, il est important d'utiliser le même jeton dans la requête de recherche pour rechercher les valeursnull. Il est également recommandé d'utiliser cette fonctionnalité uniquement avec des champs non-analysés ().analyze=Analyze.NOAvertissement
Lors de l'implémentation d'une classeFieldBridgeouTwoWayFieldBridgepersonnalisée, il appartient au développeur de gérer l'indexation des valeurs nulles (voir JavaDocs deLuceneOptions.indexNullAs()).
13.2.1.1.3. @NumericField Copier lienLien copié sur presse-papiers!
@Field appelée @NumericField pouvant être spécifiée dans la même étendue que @Field ou @DocumentId. Elle peut être spécifiée pour les propriétés Integer, Long, Float et Double. Au moment de l'indexation, la valeur sera indexée à l'aide d'une structure Trie. Une propriété indexée comme champ numérique plutôt que propriété standard permet une requête de données plus rapide que sur des propriétés @Field standards. L'annotation @NumericField accepte les paramètres suivants :
| Valeur | Définition |
|---|---|
| forField | (Facultatif) Spécifier le nom du @Field correspondant qui sera indexé comme numérique. Cela est uniquement obligatoire lorsque la propriété contient plus d'une déclaration @Field. |
| precisionStep | (Facultatif) Change la manière dont la structure « Trie » est stockée dans l'index. Des étapes de précision plus petites mènent à davantage d'utilisation d'espace disque et des requêtes de trie et de gamme plus rapides. Des valeurs supérieures conduisent à un espace utilisé moindre et à une performance de requête de gamme plus proche de la requête de gamme dans les @Fields normaux. La valeur par défaut est 4. |
@NumericField prend uniquement en charge Double, Long, Integer et Float. Il n'est pas possible de prendre un avantage d'une fonctionnalité similaire dans Lucene pour les autres types numériques. Les types restants doivent donc utiliser la chaîne dont le codage est effectué par la classe TwoWayFieldBridge par défaut ou personnalisée.
NumericFieldBridge personnalisée si vous savez gérer l'approximation lors de la transformation du type :
Exemple 13.9. Définition d'une classe NumericFieldBridge personnalisée
13.2.1.1.4. @Id Copier lienLien copié sur presse-papiers!
id (identifiant) d'une entité est une propriété spéciale utilisée par Hibernate Search pour assurer l'unicité d'index d'une entité donnée. Un id doit être stocké et ne pas être segmenté. Pour identifier une propriété comme identifiant d'index, utilisez l'annotation @DocumentId. Si vous utilisez JPA et que vous avez spécifié @Id, vous pouvez omettre @DocumentId. L'identifiant d'entité choisi sera également utilisé comme identifiant de document.
Exemple 13.10. Spécification des propriétés indexées
id , Abstract, text et grade. Veuillez noter que par défaut, le nom de champ ne contient pas de majuscules, d'après les normes JavaBean. Le champ grade est annoté comme numérique avec une étape de précision légèrement plus large que celle par défaut.
13.2.1.2. Mapper des propriétés plusieurs fois Copier lienLien copié sur presse-papiers!
Exemple 13.11. Utilisation de @Fields pour mapper une propriété plusieurs fois
summary est indexé deux fois, la première fois comme summary avec des jetons, puis comme summary_forSort sans jetons.
13.2.1.3. Objets associés et intégrés Copier lienLien copié sur presse-papiers!
address.city:Atlanta). Les champs de lieu seront indexés dans l'index Place. Les documents de l'index Place contiendront également les champs address.id, address.street et address.city pour lesquels vous pourrez faire une requête.
Exemple 13.12. Associations d'indexation
@IndexedEmbedded, Hibernate Search doit être informé de tout changement dans les objets Place et Address afin de maintenir l'index à jour. Pour garantir que le document Lucene Place est mis à jour lorsque son Address est modifiée, indiquez @ContainedIn de l'autre côté de la relation bidirectionnelle.
Note
@ContainedIn est utile pour les deux associations indiquant les entités ainsi que pour les (collections d') objets intégrés.
Exemple 13.13. Utilisation imbriquée de @IndexedEmbedded et @ContainedIn
@*ToMany, @*ToOne et @Embedded peut être annoté par @IndexedEmbedded. Les attributs de la classse associée seront ensuite ajoutés à l'index d'entités principal. Dans l'Exemple 13.13, « Utilisation imbriquée de @IndexedEmbedded et @ContainedIn », l'index contiendra les champs suivants :
- id
- name
- address.street
- address.city
- address.ownedBy_name
propertyName., suivi de la convention de navigation d'objet traditionnelle. Vous pouvez le remplacer à l'aide de l'attribut prefix tel que démontré dans la propriété ownedBy.
Note
depth est nécessaire lorsque le graphique de l'objet comprend une dépendance cyclique de classes (non d'instances). Par exemple, si Owner indique Place. Hibernate Search arrêtera d'inclure les attributs intégrés indexés une fois la profondeur souhaitée atteinte (ou dès que les limites du graphique de l'objet sont atteintes). Une classe possédant une auto-référence est un exemple de dépendance cyclique. Dans notre exemple, depth étant défini sur 1, tout attribut @IndexedEmbedded dans Owner (le cas échéant) sera ignoré.
@IndexedEmbedded pour les associations d'objets vous permet d'exprimer des requêtes (à l'aide de la syntaxe de requête de Lucene) telles que :
- Renvoyer des lieux dont le nom contient JBoss et dont l'adresse se trouve à Atlanta. En requête Lucene, cela s'apparente à :
+name:jboss +address.city:atlanta
+name:jboss +address.city:atlantaCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Renvoyer des lieux dont le nom contient JBoss et dont le nom du propriétaire contient Joe. En requête Lucene, cela s'apparente à :
+name:jboss +address.ownedBy_name:joe
+name:jboss +address.ownedBy_name:joeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Note
@Indexed
@ContainedIn (tel que dans l'exemple précédent). Sinon, Hibernate Search n'a aucun moyen de mettre à jour l'index de root quand l'entité associée est mise à jour (dans notre exemple, un document index Place doit être mis à jour lorsque l'instance Address associée est mise à jour).
@IndexedEmbedded n'est pas le type d'objet ciblé par Hibernate et Hibernate Search. Cela est particulièrement le cas lorsque les interfaces sont utilisées au lieu de leur implémentation. Vous pouvez pour cette raison remplacer le type d'objet ciblé par Hibernate Search à l'aide du paramètre targetElement.
Exemple 13.14. Utilisation de la propriété targetElement de @IndexedEmbedded
13.2.1.4. Limitation de l'intégration d'objets à des chemins spécifiques Copier lienLien copié sur presse-papiers!
@IndexedEmbedded fournit également un attribut includePaths pouvant être utilisé comme alternative à ou en association avec la méthode depth (profondeur).
depth est utilisé, tous les champs indexés du type intégré seront ajoutés de manière récursive à la même profondeur. Cela complique la sélection d'un seul chemin spécifique sans ajouter tous les autres champs, qui ne sont pas forcément utiles.
includePaths de @IndexedEmbedded ».
Exemple 13.15. Utilisation de la propriété includePaths de @IndexedEmbedded
includePaths de @IndexedEmbedded » vous permet de rechercher une classe Person par name (prénom) et/ou surname (nom de famille), et/ou le name d'un parent. Le surname du parent ne sera pas indexé, la recherche des noms de famille d'un parent sera donc impossible mais cela accélèrera l'indexation, économisera de l'espace et améliorera la performance générale.
includePaths de @IndexedEmbedded incluera les chemins spécifiés en plus de que vous indexeriez normalement en spécifiant une valeur limitée pour depth. Lorsque vous utilisez includePaths et laissez depth indéfini, le comportement est équivalent à une configuration depth=0 : seuls les chemins inclus sont indexés.
Exemple 13.16. Utilisation de la propriété includePaths de @IndexedEmbedded
includePaths de @IndexedEmbedded », chaque humain aura les attributs de son nom et nom de famille indexés. Le nom et nom de famille des parents sera également indexé, de manière récursive jusqu'à la seconde ligne à cause de l'attribut de la méthode depth. Il sera possible de rechercher par nom et nom de famille, de la personne directement, de ses parents ou grands-parents. Au-delà du second niveau, nous indexerons également un niveau supplémentaire mais uniquement le nom, pas le nom de famille.
id: comme clé primaire_hibernate_class: stocke le type d'entiténame: comme champ directsurname: comme champ directparents.name: comme champ intégré à profondeur 1parents.surname: comme champ intégré à profondeur 1parents.parents.name: comme champ intégré à profondeur 2parents.parents.surname: comme champ intégré à profondeur 2parents.parents.parents.name: comme chemin supplémentaire tel que spécifié parincludePaths. Le premierparents.est déduit à partir du nom de champ, le reste du chemin est l'attribut deincludePaths