了解CQ5 Lucene索引规则

use*_*453 2 lucene jcr-sql2 aem

信息: 我已经为cq5提供了索引配置文件.我没有通过指定以下规则索引属性cq:template:

<index-rule nodeType="nt:base">
 <property nodeScopeIndex="false">cq:template</property>
</index-rule>
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT s.[cq:template] FROM [nt:base] AS s WHERE s.[cq:template] like '/apps/geometrixx/templates/contentpage'
Run Code Online (Sandbox Code Playgroud)

And*_*ury 5

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

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

要避免完全索引属性,请使用与其节点匹配的nodeType/condition属性从第一个index-rule中省略它.它必须是第一个匹配规则,因为index_config.xml文件中的规则是自上而下处理的.

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

  1. 提取开箱即用的CQL版本的indexing_config.xml(有关说明,请参阅此文档)
  2. 取出<property nodeScopeIndex="false">cq:tempate</property><index-rule nodeType="nt:base">
  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>
Run Code Online (Sandbox Code Playgroud)

警告提示:

我不确定从搜索索引中删除cq:template是否安全,因为产品代码可能会以某种方式使用它.作为最佳实践,建议仅排除自定义应用程序属性.此外,您必须在fulltext索引中包含属性,其中包含对其他内容路径的引用.这是因为当您在CQ5(AEM)中移动页面时,它会执行jcr:包含搜索以查看该页面的引用位置.因此,如果使用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