Индексирование дубового зайца

Я выполняю этот запрос JCR SQL2:

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')

И получаю предупреждение, что я должен создавать индексы:

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

Что я и сделал, вот так:

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

Где propertyName было одной из этих строк: удалено, состояние, jcr: localname, jcr: path, jcr: property, jcr: fullText, property, localname, path, user, fullText

Но я все еще получаю это предупреждение, которое, как я полагаю, означает, что мои индексы не будут использоваться. Когда я распечатываю все доступные индексы, я получаю следующее:

Доступные индексы: deleted, repMembers, counter, state, jcr: localname, jcr: path, acPrincipalName, jcr: property, jcr: fullText, uuid, property, localname, nodetype, reference, PrincipalName, path, user, authorizableId, fullText

Так что, похоже, мои индексы создаются в том же месте, где уже существуют некоторые индексы по умолчанию jcr, такие как nodetype, acPrincipalName, reference, repMembers, authorizableId и counter.

Любые намеки, что я здесь делаю не так? Я просто хочу убедиться, что запросы выполняются настолько быстро, насколько это возможно, поэтому я действительно хотел бы знать, как создавать индексы, которые будут использоваться oak.

Я использую oak версии 1.5.12, и мой репозиторий создается следующим образом:

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

person funfried    schedule 20.03.2017    source источник


Ответы (1)


Согласно вашему запросу выше, вы должны создать индекс собственности lucene в разделе / дуб: индексировать следующим образом:

<?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>

Объяснение:

+ 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
person d33t    schedule 21.03.2017
comment
Большое спасибо, вместе с вашим ответом (и пояснениями) и примерами кода из здесь I мог создать нужные мне индексы. - person funfried; 23.03.2017