2017-03-20 3 views
0

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(); 

Répondre

1

Selon votre requête ci-dessus, vous devez créer un lucene property index sous/chêne: index comme suit:

<?xml version="1.0" encoding="UTF-8"?> 
<jcr:root xmlns:my="TYPE THE MY TYPE DEFINITION URI" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 
    jcr:primaryType="oak:Unstructured" 
    indexDescription="My Index Defition" 
    compatVersion="{Long}2" 
    type="lucene" 
    async="async"> 
    <indexRules jcr:primaryType="nt:unstructured"> 
     <my:type 
     jcr:primaryType="nt:unstructured" 
     indexNodeName="{Boolean}true"> 
     <properties jcr:primaryType="nt:unstructured"> 
      <deleted name="deleted" propertyIndex="{Boolean}true" type="Boolean" jcr:primaryType="nt:unstructured"/> 
      <user name="user" analyzed="{Boolean}true" nodeScopeIndex="{Boolean}true" jcr:primaryType="nt:unstructured"/> 
      <state name="state" analyzed="{Boolean}true" nodeScopeIndex="{Boolean}true" jcr:primaryType="nt:unstructured"/> 
     </properties> 
     </my:type> 
    </indexRules> 
</jcr:root> 

Explication:

+ myCustomIndex 
    - type = "lucene" -> tells that your are defining lucene index 
    - async = "async" -> should be alsways set to "async" according the docs 
    + indexRules -> defines the rules for this index 
    + my:type -> defines the index rules for your custom node type 
     - indexNodeName = "true" -> indexes the node name and make "like" queries possible 
     + properties -> the index rules for the properties on your my:type node 
     + deleted 
      - name = "deleted" -> property name 
      - propertyIndex = "true" -> controls if this property is used for equality conditions 
      - type = "Boolean" -> property type 
     + user 
      - name = "user" -> property name 
      - analyzed = "true" -> when used as part of contains 
      - nodeScopeIndex = "Boolean" -> control whether the value of a property should be part of fulltext index 
     + state 
      - name = "state" -> property name 
      - analyzed = "true" -> when used as part of contains 
      - nodeScopeIndex = "Boolean" -> control whether the value of a property should be part of fulltext index 
+0

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