J'exécute cette requête JCR SQL2:Jackrabbit Oak indexation
SELECT * FROM [my:type] AS n
WHERE NAME(n) LIKE 'node_name_prefix.%'
AND n.deleted = CAST('false' AS BOOLEAN)
AND CONTAINS(n.user, '1f12f97d-6516-48b9-ae75-47d17ef6877f')
AND CONTAINS(n.state, 'executing')
OR CONTAINS(n.state, 'done')
Et obtenir l'avertissement que je créer des indices:
Traversed 1000 nodes with filter Filter(query=SELECT * FROM [my:type] AS n
WHERE NAME(n) LIKE 'node_name_prefix.%' AND n.deleted = CAST('false' AS
BOOLEAN) AND CONTAINS(n.user, '1f12f97d-6516-48b9-ae75-47d17ef6877f') AND
CONTAINS(n.state, 'executing') OR CONTAINS(n.state, 'done')
fullText=user:"1f12f97d-6516-48b9-ae75-47d17ef6877f" (state:"executing" OR
state:"done"), path=*, property=[:localname=[(node_name_prefix.%..],
deleted=[false], state=[is not null]]); consider creating an index or
changing the query
Ce que je l'ai fait, comme ceci:
NodeBuilder rootBuilder = this.segmentNodeStore.getRoot().builder();
NodeBuilder index = IndexUtils.getOrCreateOakIndex(rootBuilder);
NodeBuilder childNode = index.getChildNode(propertyName);
IndexUtils.createIndexDefinition(index, propertyName, true, uniqueValue, ImmutableList.of(propertyName), null);
CommitHook hook = new CompositeHook(new ConflictHook(JcrConflictHandler.createJcrConflictHandler()), new EditorHook(new ConflictValidatorProvider()));
try
{
this.segmentNodeStore.merge(rootBuilder, hook, CommitInfo.EMPTY);
}
catch(CommitFailedException ex)
{
throw new IOException(ex);
}
Où propertyName était l'une de ces chaînes: supprimé, état, jcr: nom local, jcr: chemin, jcr: propriété, jcr: fullText, propriété, nom local, path, user, fullText
Mais j'obtiens toujours cet avertissement, ce qui, je suppose, signifie que mes index ne seront pas utilisés. Lorsque j'imprime tous les index disponibles, je reçois ce qui suit:
Indices disponibles: supprimé, repMembers, compteur, état, jcr: nom local, jcr: chemin, acPrincipalName, jcr: propriété, jcr: fullText, uuid, propriété, localname , nodetype, référence, principalName, chemin, utilisateur, authorizableId, FullText
il semble donc mes indices sont créés au même endroit où certains indices par défaut RJC existent déjà, comme nodetype, acPrincipalName, référence, repMembers, authorizableId et contre
Des indices sur ce que je fais de mal ici? Je veux juste m'assurer que les requêtes sont aussi rapides que possible, donc j'aimerais vraiment savoir comment créer les index qui seront utilisés par oak.
J'utilise la version chêne 1.5.12 et mon dépôt est instancié comme ceci:
this.fileStore = FileStore.builder(new File("/path/to/my/repo")).withCacheSize(512).withMemoryMapping(true).build();
this.segmentNodeStore = SegmentNodeStore.builder(this.fileStore).build();
this.repository = new Jcr(new Oak(this.segmentNodeStore)).with(qes).withAsyncIndexing().createRepository();
Merci a lo t, avec votre réponse (et les explications) et les exemples de code de [ici] (https://gist.github.com/chetanmeh/c1ccc4fa588ed1af467b) je pourrais créer les index dont j'avais besoin. – funfried