了解CQ5 Lucene索引规则



信息:我已经向cq5提供了一个索引配置文件。我没有通过指定以下规则在属性cq:template上建立索引:

<index-rule nodeType="nt:base">
<property nodeScopeIndex="false">cq:template</property>
</index-rule>

我重建了索引。日志显示重新索引已正确完成。

我面临的问题:当我执行以下SQL2查询时,它会给我与没有上述索引规则时相同的结果:

SELECT s.[cq:template] FROM [nt:base] AS s WHERE s.[cq:template] like '/apps/geometrixx/templates/contentpage'

您的规则实际上从索引中省略了除cq:template规则之外的所有属性(并从全文索引中排除了cq:template,因为您定义了nodeScopeIndex="false")。有关更多详细信息,请参阅jackrabbit文档。

定义元素<property nodeScopeIndex="false">cq:template</property>时,系统会在索引中包含该属性。但是,nodeScopeIndex="false"告诉CRX/Jackrabbit不要在全文索引中包含该属性。这意味着它将可用于所有搜索,但在sql中使用contains(…)或在xpath中使用jcr:contains(..)的搜索除外。

若要避免对属性进行完全索引,请从具有与其节点匹配的nodeType/contension属性的第一个索引规则中省略该属性。它必须是第一个匹配规则,因为index_config.xml文件中的规则是自上而下处理的。

因此,要从CQ5中的索引中删除cq:template属性,请执行以下操作:

  1. 提取indexing_config.xml的开箱即用CQ5版本(有关说明,请参阅此文档)
  2. <index-rule nodeType="nt:base">中删除<property nodeScopeIndex="false">cq:tempate</property>
  3. 将最后一条规则<property isRegexp="true">中的正则表达式从.*:.*更改为^(?!cq:template).*:.*$

进行更改后,索引规则应该如下所示:

<index-rule nodeType="nt:base">
<property nodeScopeIndex="false">analyticsProvider</property>
<property nodeScopeIndex="false">analyticsSnippet</property>
<property nodeScopeIndex="false">hideInNav</property>
<property nodeScopeIndex="false">offTime</property>
<property nodeScopeIndex="false">onTime</property>
<property nodeScopeIndex="false">cq:allowedTemplates</property>
<property nodeScopeIndex="false">cq:childrenOrder</property>
<property nodeScopeIndex="false">cq:cugEnabled</property>
<property nodeScopeIndex="false">cq:cugPrincipals</property>
<property nodeScopeIndex="false">cq:cugRealm</property>
<property nodeScopeIndex="false">cq:designPath</property>
<property nodeScopeIndex="false">cq:isCancelledForChildren</property>
<property nodeScopeIndex="false">cq:isDeep</property>
<property nodeScopeIndex="false">cq:lastModified</property>
<property nodeScopeIndex="false">cq:lastModifiedBy</property>
<property nodeScopeIndex="false">cq:lastPublished</property>
<property nodeScopeIndex="false">cq:lastPublishedBy</property>
<property nodeScopeIndex="false">cq:lastReplicated</property>
<property nodeScopeIndex="false">cq:lastReplicatedBy</property>
<property nodeScopeIndex="false">cq:lastReplicationAction</property>
<property nodeScopeIndex="false">cq:lastReplicationStatus</property>
<property nodeScopeIndex="false">cq:lastRolledout</property>
<property nodeScopeIndex="false">cq:lastRolledoutBy</property>
<property nodeScopeIndex="false">cq:name</property>
<property nodeScopeIndex="false">cq:parentPath</property>
<property nodeScopeIndex="false">cq:segments</property>
<property nodeScopeIndex="false">cq:siblingOrder</property>
<property nodeScopeIndex="false">cq:template</property>
<property nodeScopeIndex="false">cq:trigger</property>
<property nodeScopeIndex="false">cq:versionComment</property>
<property nodeScopeIndex="false">jcr:createdBy</property>
<property nodeScopeIndex="false">jcr:lastModifiedBy</property>
<property nodeScopeIndex="false">sling:alias</property>
<property nodeScopeIndex="false">sling:resourceType</property>
<property nodeScopeIndex="false">sling:vanityPath</property>
<property isRegexp="true">^(?!cq:template).*:.*$</property>
</index-rule>

注意警告:

我不确定从搜索索引中删除cq:template是否安全,因为产品代码可能会以某种方式使用它。作为最佳实践,建议仅排除自定义应用程序属性。此外,必须在全文索引中包含属性,这些属性包含对其他内容路径的引用。这是因为当您在CQ5(AEM)中移动页面时,它会执行jcr:contains搜索,以查看该页面的引用位置。因此,如果使用nodeScopeIndex="false"排除此类属性,或者通过修改上面的正则表达式来省略它们,则引用搜索将失败。然后你会得到对旧路径的陈旧引用。


参考文献:

  1. 官方indexing_config.xml参考:http://wiki.apache.org/jackrabbit/IndexingConfiguration
  2. 关于如何在CQ5中更新indexing_config.xml的说明:http://helpx.adobe.com/experience-manager/kb/SearchIndexingConfig.html

最新更新