本文介绍如何在AEM 6中配置索引。 有关优化查询和索引性能的最佳实践,请参阅查询和索引的最佳实践。
与Jackrabbit 2不同,默认情况下,Oak不会为内容编入索引。 需要创建自定义索引(如有必要),这与使用传统关系数据库非常类似。 如果特定查询没有索引,则可能会遍历许多节点。 查询可能仍然有效,但可能非常慢。
如果Oak遇到没有索引的查询,则会打印一条“警告”级别的日志消息:
*WARN* Traversed 1000 nodes with filter Filter(query=select ...) consider creating an index or changing the query
Oak查询引擎支持以下语言:
基于Apache Oak的后端允许将不同的索引器插入存储库。
一个索引器是属性索引,索引定义存储在存储库本身中。
默认情况下,还提供了Apache Lucene和Solr的实施,这两种实施都支持全文索引。
如果没有其他索引器可用,则使用遍历索引。 这意味着内容未编入索引,并且内容节点会经过遍历以查找与查询的匹配项。
如果一个查询有多个索引器,则每个可用索引器估计执行查询的成本。 然后,Oak以最低的估计成本选择索引器。
上图是对Apache Oak查询执行机制的高级表示。
首先,将查询解析为抽象语法树。 然后,将查询检查并转换为SQL-2,SQL-2是Oak查询的本机语言。
接下来,将参考每个索引以估算查询的成本。 完成后,将检索最便宜指数的结果。 最后,过滤结果,以确保当前用户具有对结果的读取权限,并且结果与完整查询匹配。
如果在非常大的存储库中需要重新索引,特别是在使用MongoDB和对全文索引时,请考虑文本预提取,并使用oak-run构建初始索引和重新索引。
索引将配置为存储库中oak:index节点下的节点。
索引节点的类型必须为oak:QueryIndexDefinition。 每个索引器都有几个配置选项作为节点属性。有关详细信息,请参阅下面每个索引器类型的配置详细信息。
属性索引通常适用于具有属性约束但不是全文的查询。 它可以按照以下过程进行配置:
通过转到http://localhost:4502/crx/de/index.jsp
打开CRXDE
在oak:index下创建新节点
将节点命名为PropertyIndex,并将节点类型设置为oak:QueryIndexDefinition
为新节点设置以下属性:
property
(类型为字符串)jcr:uuid
(类型为Name)此特定示例将索引jcr:uuid
属性,该属性的工作是显示其所附加到节点的通用唯一标识符(UUID)。
保存更改。
属性索引具有以下配置选项:
type属性将指定索引的类型,在这种情况下,必须将其设置为属性
propertyNames属性指示将存储在索引中的属性列表。 如果缺少该值,则节点名称将用作属性名称引用值。 在此示例中,将作业为显示其节点的唯一标识符(UUID)的jcr:uuid属性添加到索引中。
唯一标记,如果设置为true,则会在属性索引中添加唯一性约束。
declaringNodeTypes属性允许您指定索引将仅应用于的特定节点类型。
reindex标记,如果设置为true,则会触发完整的内容重新索引。
Ordered索引是属性索引的扩展。 但是,它已被弃用。 此类型的索引需要替换为Lucene属性索引。
AEM 6中提供了基于Apache Lucene的全文索引器。
如果配置了全文索引,则所有具有全文条件的查询都使用全文索引,无论是否有其他条件已编入索引,也无论是否存在路径限制。
如果未配置全文索引,则包含全文条件的查询将无法按预期工作。
由于索引是通过异步后台线程更新的,因此在后台进程完成之前,某些全文搜索将在一小段时间内不可用。
您可以按照以下步骤配置Lucene全文索引:
打开CRXDE并在oak:index下创建新节点。
将节点命名为LuceneIndex,并将节点类型设置为oak:QueryIndexDefinition
将以下属性添加到节点:
lucene
(类型为字符串)async
(字符串类型)保存更改。
Lucene索引具有以下配置选项:
由于Oak 1.0.8,因此Lucene可用于创建包含非全文属性约束的索引。
要实现Lucene属性索引,fulltextEnabled属性必须始终设置为false。
以下查询示例为例:
select * from [nt:base] where [alias] = '/admin'
为了为上述查询定义Lucene属性索引,您可以通过在oak:index:下创建新节点来添加以下定义
LucenePropertyIndex
oak:QueryIndexDefinition
创建节点后,添加以下属性:
类型:
lucene (of type String)
异步:
async (of type String)
fulltextEnabled:
false (of type Boolean)
includePropertyNames: [alias]
(类型为字符串)
与常规属性索引相比,Lucene属性索引始终在异步模式下配置。 因此,索引返回的结果可能并不总是反映存储库的最新状态。
有关Lucene属性索引的更多具体信息,请参阅Apache Jackrabbit Oak Lucene文档页面。
自版本1.2.0起,Oak支持Lucene分析程序。
在文档编入索引时和在查询时都使用分析程序。 分析器检查字段文本并生成令牌流。 Lucene分析器由一系列标记器和过滤器类组成。
可以通过oak:index
定义内的analyzers
节点(类型为nt:unstructured
)配置分析程序。
索引的默认分析器在分析器节点的default
子级中配置。
有关可用分析程序的列表,请查阅您所使用的Lucene版本的API文档。
如果您希望使用任何现成的分析器,可以按照以下过程对其进行配置:
在oak:index
节点下找到要使用分析器的索引。
在索引下,创建名为default
的类型为nt:unstructured
的子节点。
将具有以下属性的属性添加到默认节点:
class
String
org.apache.lucene.analysis.standard.StandardAnalyzer
该值是您希望使用的分析器类的名称。
您还可以使用可选的luceneMatchVersion
字符串属性将分析器设置为与特定Lucene版本一起使用。 在Lucene 4.7中使用它的有效合成酶是:
luceneMatchVersion
String
LUCENE_47
如果未提供luceneMatchVersion
,Oak将使用随附的Lucene版本。
如果要向分析器配置中添加秒表文件,则可以在default
下创建一个具有以下属性的新节点:
stopwords
nt:file
分析程序也可以基于Tokenizers
、TokenFilters
和CharFilters
进行组合。 为此,您可以指定一个分析器,并创建其可选令牌和过滤器的子节点,这些节点将按列表顺序应用。 另请参阅https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#Specifying_an_Analyzer_in_the_schema
以此节点结构为例:
名称: analyzers
名称: default
名称: charFilters
类型: nt:unstructured
HTMLStrip
Mapping
名称: tokenizer
属性名称: name
String
Standard
名称: filters
类型: nt:unstructured
名称: LowerCase
名称: Stop
属性名称: words
String
stop1.txt, stop2.txt
名称: stop1.txt
nt:file
名称: stop2.txt
nt:file
过滤器、charFilters和令牌器的名称通过删除工厂后缀来形成。 因此:
org.apache.lucene.analysis.standard.StandardTokenizerFactory
变量 standard
org.apache.lucene.analysis.charfilter.MappingCharFilterFactory
变量 Mapping
org.apache.lucene.analysis.core.StopFilterFactory
变量 Stop
工厂所需的任何配置参数都指定为相关节点的属性。
对于需要加载来自外部文件的内容的停止词等情况,可以通过为相关文件创建nt:file
类型的子节点来提供内容。
索尔索引的目的主要是全文搜索,但也可以用于按路径、属性限制和主要类型限制进行索引搜索。 这意味着Oak中的Solr索引可用于任何类型的JCR查询。
AEM中的集成在存储库级别进行,因此Solr是可在Oak中使用的索引之一,Oak是AEM附带的新存储库实施。
它可以配置为作为具有AEM实例的嵌入式服务器或作为远程服务器使用。
请勿在生产环境中使用嵌入式Solr服务器。 它只应在开发环境中使用。
AEM可与可通过Web控制台配置的嵌入式Solr服务器一起使用。 在这种情况下,Solr服务器将在与其嵌入到的AEM实例相同的JVM中运行。
您可以通过以下方式配置嵌入式Solr服务器:
转到位于https://serveraddress:4502/system/console/configMgr
的Web控制台
搜索“Oak Solr服务器提供程序”。
按编辑按钮,在以下窗口中,将下拉列表中的服务器类型设置为Embedded Solr。
接下来,编辑“Oak Solr嵌入式服务器配置”并创建配置。 有关配置选项的更多信息,请访问Apache Solr网站。
Solr主目录(solr.home.path)配置将在AEM安装文件夹中查找同名文件夹。
打开CRXDE并以管理员身份登录。
在oak:index下添加名为solrlndex的类型<aak:QueryIndexDefinition的节点,其属性如下:
solr
(类型为字符串)async
(字符串类型)true
(类型为布尔值)保存更改。
AEM还可配置为与远程Solr服务器实例一起使用:
下载并提取最新版本的Solr。 有关如何执行此操作的更多信息,请参阅Apache Solr安装文档。
现在,创建两个索尔碎片。 为此,您可以在Solr已上线的文件夹中为每个共享创建文件夹:
<solrunpackdirectory>\aemsolr1\node1
<solrunpackdirectory>\aemsolr2\node2
在Solr包中找到示例实例。 它通常位于包根目录中名为“ example
”的文件夹中。
将以下文件夹从示例实例复制到两个共享文件夹(aemsolr1\node1
和aemsolr2\node2
):
contexts
etc
lib
resources
scripts
solr-webapp
webapps
start.jar
在两个共享文件夹中的每个文件夹中创建一个名为“ cfg
”的新文件夹。
将Solr和Zookeeper配置文件放入新创建的cfg
文件夹中。
有关Solr和ZooKeeper配置的更多信息,请参阅Solr配置文档和ZooKeeper入门指南。
通过转到aemsolr1\node1
并运行以下命令,启动支持ZooKeeper的第一个共享:
java -Xmx2g -Dbootstrap_confdir=./cfg/oak/conf -Dcollection.configName=myconf -DzkRun -DnumShards=2 -jar start.jar
通过转到aemsolr2\node2
并运行以下命令来启动第二个共享:
java -Xmx2g -Djetty.port=7574 -DzkHost=localhost:9983 -jar start.jar
启动这两个分片后,通过连接到http://localhost:8983/solr/#/
的Solr接口,测试所有内容是否已启动并正在运行
启动AEM并转到位于http://localhost:4502/system/console/configMgr
的Web控制台
在Oak Solr远程服务器配置下设置以下配置:
http://localhost:8983/solr/
在Oak Solr服务器提供程序下方的下拉列表中选择远程Solr。
转到CRXDE并以管理员身份登录。
在oak:index下创建一个名为solrIndex的新节点,并设置以下属性:
保存更改。
以下是基本配置示例,该示例可用于本文中描述的所有三个Solr部署。 它包含AEM中已存在的专用属性索引,这些索引不应用于其他应用程序。
要正确使用它,您需要将存档的内容直接放入Solr Home Directory中。 对于多节点部署,它应直接位于每个节点的根文件夹下。
推荐的Solr配置文件
AEM 6.1还集成了AEM 6.0中存在的两个索引工具,作为Adobe咨询服务共用工具集的一部分:
现在,您可以从AEM欢迎屏幕中转到工具 — 操作 — 功能板 — 诊断来访问它们。
有关如何使用它们的更多信息,请参阅操作功能板文档。
ACS Commons包还公开了可用于创建属性索引的OSGi配置。
您可以通过搜索“Ensure Oak Property Index”,从Web控制台访问该索引。
出现查询执行时间较长,且一般系统响应时间较慢的情况。
本节就需要采取哪些措施来跟踪这些问题的原因提出一系列建议,并就如何解决这些问题提出建议。
获取正在执行的查询所需信息的最简单方法是通过解释查询工具。 这样,您就可以收集调试慢速查询所需的准确信息,而无需查阅日志级别信息。 如果您知道正在调试的查询,则此操作是理想的。
如果由于任何原因无法实现此目的,您可以将索引日志收集到单个文件中,并使用它来解决您的特定问题。
要启用日志记录,您需要为与Oak索引和查询相关的类别启用DEBUG级别日志。 这些类别包括:
com.day.cq.search类别仅在您使用AEM提供的QueryBuilder实用程序时才适用。
在执行要进行故障诊断的查询的过程中,日志只设置为DEBUG,这一点很重要,否则日志中会随着时间的推移生成大量事件。 因此,在收集到所需日志后,会针对上述类别切换回信息级别日志记录。
您可以通过以下过程启用日志记录:
将浏览器指向https://serveraddress:port/system/console/slinglog
单击控制台下方的Add new Logger按钮。
在新创建的行中,添加上述类别。 您可以使用+符号向单个日志记录器添加多个类别。
从日志级别下拉列表中选择DEBUG。
将输出文件设置为logs/queryDebug.log
。 这会将所有调试事件关联到单个日志文件中。
运行查询或渲染使用要调试的查询的页面。
执行查询后,返回到日志记录控制台,并将新创建的日志记录器的日志级别更改为INFO。
查询的评估方式在很大程度上受索引配置的影响。 获取索引配置以便进行分析或发送给支持非常重要。 您可以作为内容包获取配置,也可以获取JSON呈现版本。
由于在大多数情况下,索引配置存储在CRXDE的/oak:index
节点下,因此您可以在以下位置获取JSON版本:
https://serveraddress:port/oak:index.tidy.-1.json
如果索引配置在其他位置,请相应地更改路径。
在某些情况下,提供与索引相关的MBean的输出以进行调试会很有帮助。 您可以通过以下方式执行此操作:
转到JMX控制台:
https://serveraddress:port/system/console/jmx
搜索以下MBean:
单击每个MBean以获取性能统计信息。 创建屏幕截图或记下它们,以备需要提交支持。
您还可以通过以下URL获取这些统计信息的JSON变体:
https://serveraddress:port/system/sling/monitoring/mbeans/org/apache/jackrabbit/oak/%2522LuceneIndex%2522.tidy.-1.json
https://serveraddress:port/system/sling/monitoring/mbeans/org/apache/jackrabbit/oak/%2522LuceneIndex%2522.tidy.-1.json
https://serveraddress:port/system/sling/monitoring/mbeans/org/apache/jackrabbit/oak/%2522LuceneIndex%2522.tidy.-1.json
https://serveraddress:port/system/sling/monitoring/mbeans/org/apache/jackrabbit/oak/%2522LuceneIndex%2522.tidy.-1.json
您还可以通过https://serveraddress:port/system/sling/monitoring/mbeans/org/apache/jackrabbit/oak.tidy.3.json
提供统一的JMX输出。 这将包含JSON格式的所有与Oak相关的MBean详细信息。
您可以收集其他详细信息以帮助解决问题,例如:
org.apache.jackrabbit.oak-core
包的版本来查看此代码。https://serveraddress:port/libs/cq/search/content/querydebug.html