Bonnes pratiques relatives à l’indexation dans AEM
Découvrez les bonnes pratiques d’indexation dans Adobe Experience Manager (AEM). Apache Jackrabbit Oak alimente la recherche de contenu dans AEM et les points clés suivants :
- AEM fournit divers index prêts à l’emploi pour prendre en charge la fonctionnalité de recherche et de requête, par exemple
damAssetLucene
,cqPageLucene
et plus encore. - Toutes les définitions d’index sont stockées dans le référentiel sous le nœud
/oak:index
. - AEM as a Cloud Service ne prend en charge que les index Oak Lucene.
- La configuration de l’index doit être gérée dans la base de code de projet AEM et déployée à l’aide des pipelines CI/CD Cloud Manager.
- Si plusieurs index sont disponibles pour une requête donnée, l’index dont le coût estimé est le plus bas est utilisé.
- Si aucun index n’est disponible pour une requête donnée, l’arborescence de contenu est parcourue pour trouver le contenu correspondant. Toutefois, la limite par défaut via
org.apache.jackrabbit.oak.query.QueryEngineSettingsService
est de parcourir seulement 10 000 nœuds. - Les résultats d’une requête sont filtrés en dernier lieu pour s’assurer que la personne actuelle dispose d’un accès en lecture. Cela signifie que les résultats de la requête peuvent être inférieurs au nombre de nœuds indexés.
- La réindexation du référentiel après les modifications de définition d’index nécessite du temps et dépend de la taille du référentiel.
Pour disposer d’une fonctionnalité de recherche efficace et correcte qui n’affecte pas les performances de l’instance AEM, il est important de comprendre les bonnes pratiques d’indexation.
Index personnalisé ou prêt à l’emploi
Parfois, vous devez créer des index personnalisés pour répondre à vos besoins de recherche. Suivez toutefois les instructions ci-dessous avant de créer des index personnalisés :
-
Comprenez les exigences de recherche et vérifiez si les index prêts à l’emploi peuvent répondre à vos besoins de recherche. Utilisez l’outil de performances des requêtes, disponible sur le SDK local et AEMCS via la Developer Console ou
https://author-pXXXX-eYYYY.adobeaemcloud.com/ui#/aem/libs/granite/operations/content/diagnosistools/queryPerformance.html?appId=aemshell
. -
Définissez une requête optimale, utilisez le graphique de flux optimisation des requêtes et l’aide-mémoire pour les requêtes JCR à titre de référence.
-
Si les index prêts à l’emploi ne répondent pas aux besoins de recherche, vous disposez de deux options. Toutefois, passez en revue les Conseils pour créer des index efficaces.
- Personnaliser l’index prêt à l’emploi : option préférée, car il est facile de le gérer et de le mettre à niveau.
- Index entièrement personnalisé : uniquement si l’option ci-dessus ne fonctionne pas.
Personnaliser l’index prêt à l’emploi
-
Dans AEMCS, lors de la personnalisation de l’index prêt à l’emploi, utilisez la convention de nommage <OOTBIndexName>-<productVersion>-custom-<customVersion>. Par exemple,
cqPageLucene-custom-1
oudamAssetLucene-8-custom-1
. Cela permet de fusionner la définition d’index personnalisée chaque fois que l’index prêt à l’emploi est mis à jour. Consultez Modifications apportées aux index prêts à l’emploi pour plus d’informations. -
Dans AEM 6.X, la convention de nommage ci-dessus ne fonctionne pas, mais il vous suffit de mettre à jour l’index prêt à l’emploi avec les propriétés nécessaires dans le nœud
indexRules
. -
Copiez toujours la dernière définition d’index prêt à l’emploi de l’instance AEM à l’aide du gestionnaire de packages CRX DE (https://experienceleague.adobe.com/crx/packmgr/?lang=fr), renommez-la et ajoutez des personnalisations dans le fichier XML.
-
Stockez la définition d’index dans le projet AEM à l’adresse
ui.apps/src/main/content/jcr_root/_oak_index
et déployez-la à l’aide des pipelines CI/CD Cloud Manager. Consultez Déploiement de définitions d’index personnalisé pour plus d’informations.
Index entièrement personnalisé
La création d’un index entièrement personnalisé doit être votre dernière option et uniquement si l’option ci-dessus ne fonctionne pas.
-
Lors de la création d’un index entièrement personnalisé, utilisez la convention de nommage <prefix>.<customIndexName>-<version>-custom-<customVersion>. Par exemple,
wknd.adventures-1-custom-1
. Cela permet d’éviter les conflits de nommage. Ici,wknd
est le préfixe etadventures
est le nom d’index personnalisé. Cette convention s’applique à AEM 6.X et AEMCS et permet de préparer une migration future vers AEMCS. -
AEMCS ne prend en charge que les index Lucene. Pour préparer une migration ultérieure vers AEMCS, utilisez toujours les index Lucene. Consultez Index Lucene par rapport aux index de propriété pour plus d’informations.
-
Évitez de créer un index personnalisé sur le même type de nœud que l’index prêt à l’emploi. À la place, personnalisez l’index prêt à l’emploi avec des propriétés nécessaires dans le nœud
indexRules
. Par exemple, ne créez pas d’index personnalisé sur le type de nœuddam:Asset
, mais personnalisez l’indexdamAssetLucene
prêt à l’emploi. Il s’agit d’une cause courante des problèmes de performances et de fonctionnement.. -
Évitez également d’ajouter plusieurs types de nœud, par exemple
cq:Page
etcq:Tag
, sous le nœud des règles d’indexation (indexRules
). Créez plutôt des index distincts pour chaque type de nœud. -
Comme mentionné dans la section ci-dessus, stockez la définition d’index dans le projet AEM à l’adresse
ui.apps/src/main/content/jcr_root/_oak_index
et déployez-la à l’aide des pipelines CI/CD Cloud Manager. Consultez Déploiement de définitions d’index personnalisés pour plus d’informations. -
Les directives de définition d’index sont les suivantes :
- Le type de nœud (
jcr:primaryType
) doit êtreoak:QueryIndexDefinition
. - Le type d’index (
type
) doit êtrelucene
. - La propriété async (
async
) doit êtreasync,nrt
. - Utilisez
includedPaths
et évitez la propriétéexcludedPaths
. La valeurqueryPaths
doit toujours être identique à la valeurincludedPaths
. - Pour appliquer la restriction de chemin, utilisez la propriété
evaluatePathRestrictions
et définissez-la surtrue
. - Utilisez la propriété
tags
pour baliser l’index et, lors de l’interrogation, spécifiez la valeur de ces balises pour utiliser l’index. La syntaxe de requête générale est la suivante :<query> option(index tag <tagName>)
.
code language-xml /oak:index/wknd.adventures-1-custom-1 - jcr:primaryType = "oak:QueryIndexDefinition" - type = "lucene" - compatVersion = 2 - async = ["async", "nrt"] - includedPaths = ["/content/wknd"] - queryPaths = ["/content/wknd"] - evaluatePathRestrictions = true - tags = ["customAdvSearch"] ...
- Le type de nœud (
Exemples
Pour comprendre les bonnes pratiques, examinons quelques exemples.
Utilisation incorrecte de la propriété de balises
L’image ci-dessous présente la définition d’index personnalisés et prêts à l’emploi, en mettant en surbrillance la propriété tags
, les deux index utilisent la même valeur visualSimilaritySearch
.
Analyse
Il s’agit d’une utilisation incorrecte de la propriété tags
sur l’index personnalisé. Le moteur de requête Oak sélectionne l’index personnalisé plutôt que l’index prêt à l’emploi en raison du coût estimé le plus faible.
La bonne méthode consiste à personnaliser l’index prêt à l’emploi et à ajouter des propriétés supplémentaires dans le nœud indexRules
. Consultez Personnalisation de l’index prêt à l’emploi pour plus d’informations.
Index sur le type de nœud dam:Asset
L’image ci-dessous affiche l’index personnalisé pour le type de nœud dam:Asset
avec la propriété includedPaths
définie sur un chemin d’accès spécifique.
Analyse
Si vous effectuez une recherche Omnisearch sur Assets, elle renvoie des résultats incorrects, car le coût estimé de l’index personnalisé est plus faible.
Ne créez pas d’index personnalisé sur le type de nœud dam:Asset
, mais personnalisez l’index damAssetLucene
prêt à l’emploi avec les propriétés nécessaires dans le nœud indexRules
.
Plusieurs types de nœud sous des règles d’indexation
L’image ci-dessous présente l’index personnalisé avec plusieurs types de nœud sous le nœud indexRules
.
Analyse
Il n’est pas recommandé d’ajouter plusieurs types de nœuds dans un seul index. Cependant, il est recommandé d’indexer les types de nœuds dans le même index si les types de nœuds sont étroitement liés, par exemple : cq:Page
et cq:PageContent
.
Une solution valide consiste à personnaliser les index cqPageLucene
et damAssetLucene
prêts à l’emploi et à ajouter les propriétés nécessaires sous le nœud indexRules
existant.
Absence de la propriété queryPaths
L’image ci-dessous affiche un index personnalisé (qui ne suit pas non plus la convention de nommage) sans la propriété queryPaths
.
Analyse
Définissez toujours la valeur queryPaths
pour qu’elle soit identique à la valeur includedPaths
. En outre, pour forcer la restriction de chemin, définissez la propriété evaluatePathRestrictions
sur true
.
Interroger avec une balise d’index
L’image ci-dessous affiche un index personnalisé avec la propriété tags
et la manière de l’utiliser lors de l’interrogation.
/jcr:root/content/dam//element(*,dam:Asset)[(jcr:content/@contentFragment = 'true' and jcr:contains(., '/content/sitebuilder/test/mysite/live/ja-jp/mypage'))]order by @jcr:created descending option (index tag assetPrefixNodeNameSearch)
Analyse
Indique comment définir des règles non conflictuelles et une valeur de propriété tags
correcte pour l’index et comment l’utiliser lors de l’interrogation. La syntaxe de requête générale est la suivante : <query> option(index tag <tagName>)
. Voir également Option de requête avec balise d’index
Index personnalisé
L’image ci-dessous affiche un index personnalisé avec le nœud suggestion
pour accéder à la fonctionnalité de recherche avancée.
Analyse
Il s’agit d’un cas d’utilisation valide pour créer un index personnalisé pour la fonctionnalité de recherche avancée. Cependant, le nom de l’index doit respecter la convention de nommage <prefix>.<customIndexName>-<version>-custom-<customVersion>.
Optimisation de l’index en désactivant Apache Tika
AEM utilise Apache Tika pour extraire les métadonnées et le contenu de texte à partir de types de fichier tels que PDF, Word, Excel, etc. Le contenu extrait est stocké dans le référentiel et indexé par l’index Oak Lucene.
Parfois, il n’est pas nécessaire de rechercher dans le contenu d’un fichier ou d’une ressource. Dans ce cas, vous pouvez améliorer les performances d’indexation en désactivant Apache Tika. Les avantages sont les suivants :
- Indexation plus rapide
- Réduction de la taille de l’index
- Moins d’utilisation matérielle
Désactiver par type MIME
Pour désactiver Apache Tika par type MIME, procédez comme suit :
- Ajoutez le nœud
tika
de typent:unstructured
sous la définition d’index personnalisée ou prête à l’emploi. Dans l’exemple suivant, le type MIME du PDF est désactivé pour l’indexdamAssetLucene
prêt à l’emploi.
/oak:index/damAssetLucene
- jcr:primaryType = "oak:QueryIndexDefinition"
- type = "lucene"
...
<tika jcr:primaryType="nt:unstructured">
<config.xml/>
</tika>
- Ajoutez le
config.xml
avec les détails suivants sous le nœudtika
.
<properties>
<parsers>
<parser class="org.apache.tika.parser.EmptyParser">
<mime>application/pdf</mime>
<!-- Add more mime types to disable -->
</parsers>
</properties>
- Pour actualiser l’index stocké, définissez la propriété
refresh
surtrue
dans le nœud de définition d’index. Voir Propriétés de définition d’index pour plus d’informations.
L’image suivante présente l’index damAssetLucene
prêt à l’emploi avec le nœud tika
et le fichier config.xml
qui désactive le PDF et d’autres types MIME.
Désactiver complètement
Pour désactiver complètement Apache Tika, procédez comme suit :
- Ajoutez une propriété
includePropertyTypes
sur/oak:index/<INDEX-NAME>/indexRules/<NODE-TYPE>
et définissez sa valeur surString
. Par exemple, dans l’image ci-dessous, la propriétéincludePropertyTypes
est ajoutée pour le type de nœuddam:Asset
de l’indexdamAssetLucene
prêt à l’emploi.
- Ajoutez
data
avec les propriétés ci-dessous sous le nœudproperties
. Assurez-vous qu’il s’agit du premier nœud au-dessus de la définition de propriété. Par exemple, voir l’image ci-dessous :
/oak:index/<INDEX-NAME>/indexRules/<NODE-TYPE>/properties/data
- jcr:primaryType = "nt:unstructured"
- type = "String"
- name = "jcr:data"
- nodeScopeIndex = false
- propertyIndex = false
- analyze = false
- Réindexez la définition d’index mise à jour en définissant la propriété
reindex
surtrue
sous le nœud de définition d’index.
Outils pratiques
Examinons quelques outils qui peuvent vous aider à définir, analyser et optimiser les index.
Outil de création d’index
L’outil Générateur de définitions d’index Oak permet de générer la définition d’index en fonction des requêtes d’entrée. Il s’agit d’un bon point de départ pour créer un index personnalisé.
Outil d’analyse d’index
L’outil Analyseur de définition d’index permet d’analyser la définition de l’index et fournit des recommandations pour améliorer la définition de l’index.
Outil de performance des requêtes
L’Outil de performance des requêtes prêt à l’emploi disponible dans le SDK local et AEMCS via la Developer Console ou https://author-pXXXX-eYYYY.adobeaemcloud.com/ui#/aem/libs/granite/operations/content/diagnosistools/queryPerformance.html?appId=aemshell
permet d’analyser les performances de la requête et l’aide-mémoire de requêtes JCR pour définir la requête optimale.
Outils et conseils de dépannage
La plupart des éléments ci-dessous sont applicables pour AEM 6.X et à des fins de dépannage local.
-
Gestionnaire d’index disponible à l’adresse
http://host:port/libs/granite/operations/content/diagnosistools/indexManager.html
pour obtenir des informations d’index telles que le type, la dernière mise à jour, la taille. -
Journalisation détaillée des packages Java™ liés à la requête Oak et à l’indexation, comme
org.apache.jackrabbit.oak.plugins.index
,org.apache.jackrabbit.oak.query
etcom.day.cq.search
viahttp://host:port/system/console/slinglog
pour la résolution des problèmes. -
JMX MBean de type IndexStats disponible à l’adresse
http://host:port/system/console/jmx
pour obtenir des informations d’index telles que le statut, la progression ou les statistiques liées à l’indexation asynchrone. Il fournit également les statistiques FailingIndexStats. En cas d’absence de résultat ici, cela signifie qu’aucun index n’est corrompu. AsyncIndexerService désigne comme corrompu tout index qui ne parvient pas à se mettre à jour pendant 30 minutes (configurable) et arrête son indexation. Si une requête ne donne pas les résultats attendus, l’équipe de développement doit la vérifier avant de poursuivre la réindexation, car cette opération est coûteuse en calcul et prend du temps. -
JMX MBean de type LuceneIndex disponible à l’adresse
http://host:port/system/console/jmx
pour les statistiques de l’index Lucene telles que la taille ou le nombre de documents par définition d’index. -
JMX MBean de type QueryStat disponible à l’adresse
http://host:port/system/console/jmx
pour Oak Query Statistics, y compris les requêtes lentes et populaires avec des détails comme la requête ou le temps d’exécution.
Ressources supplémentaires
Pour plus d’informations, reportez-vous à la documentation suivante :