从1.4版本之后,jackrabbit开始支持节点的属性索引配置.换句话说,我们可以通过配置决定哪种类型节点的哪些属性应该建立索引.这样一来,我们就能对索引内容进行优化,使得搜索更为高效.
索引配置文件也是一个XML,默认名字为indexing_configuration.xml.默认情况下,jackrabbit不会有索引配置的存在,因此要想使用它就必须在repository.xml和workspace.xml中,为SearchIndex元素添加一个参数.
示例:
<param name="indexingConfiguration" value="${wsp.home}/indexing_configuration.xml"/>
上例中,value指明了配置文件存在的相对路径,它与workspace.xml位于同一个路径下.
接下来,看看哪些问题可以通过索引配置解决.
示例:
<?xml version="1.0"?> <!DOCTYPE configuration SYSTEM "http://jackrabbit.apache.org/dtd/indexing-configuration-1.0.dtd"> <configuration xmlns:nt="http://www.jcp.org/jcr/nt/1.0"> <index-rule nodeType="nt:unstructured"> <property>Text</property> </index-rule> </configuration>
上例中,索引规则定义了nt:unstructured节点类型下,名为Text的属性需要建立索引.这条规则对nt:unstructured子类型也有效.
示例:
<?xml version="1.0"?> <!DOCTYPE configuration SYSTEM "http://jackrabbit.apache.org/dtd/indexing-configuration-1.0.dtd"> <configuration xmlns:nt="http://www.jcp.org/jcr/nt/1.0"> <index-rule nodeType="nt:unstructured" boost="2.0"> <property>Text</property> </index-rule> </configuration>
上例中,指明nt:unstructured类型的节点的激进因子(boost)为2.0,默认值是1.0,当按jcr:score进行降序排序结果集时,boost值越高位置越考前(也可能有例外,关于score的计算方法请见这里).boost值的有效范围是1.0~5.0.
若想在特定属性上指定boost参数也是可以的.
示例:(为了节省空间,下文的示例中将省略一些不必要的内容)
<index-rule nodeType="nt:unstructured"> <property boost="3.0">Title</property> <property boost="1.5">Text</property> </index-rule>
借助condition值的定义实现更具体的方式,看下面示例:
<index-rule nodeType="nt:unstructured" boost="2.0" condition="@priority = 'high'"> <property>Text</property> </index-rule>
priority属性等于high的nt:unstructured节点,它的激进因子设置为2.0,且只有名为Text的属性会被建立索引.
注意,目前针对属性的条件,仅支持等号操作符和字符串类型.
条件也可以不在当前节点上,示例:
<index-rule nodeType="nt:unstructured" boost="2.0" condition="ancestor::*/@priority = 'high'"> <property>Text</property> </index-rule> <index-rule nodeType="nt:unstructured" boost="0.5" condition="parent::foo/@priority = 'low'"> <property>Text</property> </index-rule> <index-rule nodeType="nt:unstructured" boost="1.5" condition="bar/@priority = 'medium'"> <property>Text</property> </index-rule> 当有多规则应用于统一个类型时,最先满足条件的那个规则会被应用,其余的将被忽略.
在条件中也是可以指定节点类型的,但类型的匹配必须是精确的(exact),也就是不支持类型的子类.
示例:
<index-rule nodeType="nt:unstructured" boost="2.0" condition="element(*, nt:unstructured)/@priority = 'high'"> <property>Text</property> </index-rule>
默认情况下,凡STRING类型的属性以及其它可以抽取文本的属性都是进行全文索引的.
这就意味着,你可以通过类似jcr:contains(., 'foo')的条件查找到含有foo关键的文本所在的位置.
有时,类似省市地区这样的属性,就没有必要做全文索引,那么可以通过下面的方式禁用全文索引:
<index-rule nodeType="nt:unstructured"> <property nodeScopeIndex="false">Text</property> </index-rule>
jackrabbit 1.5支持这样的特性,同时要确保使用DTD1.1的版本.
示例:
<?xml version="1.0"?> <!DOCTYPE configuration SYSTEM "http://jackrabbit.apache.org/dtd/indexing-configuration-1.1.dtd"> <configuration xmlns:nt="http://www.jcp.org/jcr/nt/1.0"> <index-rule nodeType="nt:unstructured"> <property isRegexp="true">.*Text</property> </index-rule> </configuration>
在属性上将useInExcerpt设置为false,可以禁用属性的文本摘要(excerpt)特性,这也是1.5的默认特性.
<?xml version="1.0"?> <!DOCTYPE configuration SYSTEM "http://jackrabbit.apache.org/dtd/indexing-configuration-1.0.dtd"> <configuration xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"> <aggregate primaryType="nt:file"> <include>jcr:content</include> </aggregate> </configuration>
通过配置aggregate元素来解决这个问题.上例中,就指明了nt:file的jcr:content子节点的索引会指向nt:file.
当然,还可以限定子节点的类型,并用"*"匹配所有子节点,示例:
<?xml version="1.0"?> <!DOCTYPE configuration SYSTEM "http://jackrabbit.apache.org/dtd/indexing-configuration-1.0.dtd"> <configuration xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"> <aggregate primaryType="nt:file"> <include primaryType="nt:resource">*</include> </aggregate> </configuration>
还可以通过深度(相对路径)来匹配多层子节点,示例:
<?xml version="1.0"?> <!DOCTYPE configuration SYSTEM "http://jackrabbit.apache.org/dtd/indexing-configuration-1.0.dtd"> <configuration xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"> <aggregate primaryType="nt:file"> <include>*</include> <include>*/*</include> <include>*/*/*</include> </aggregate> </configuration>
<?xml version="1.0"?> <!DOCTYPE configuration SYSTEM "http://jackrabbit.apache.org/dtd/indexing-configuration-1.0.dtd"> <configuration xmlns:nt="http://www.jcp.org/jcr/nt/1.0"> <analyzers> <analyzer class="org.apache.lucene.analysis.KeywordAnalyzer"> <property>mytext</property> </analyzer> <analyzer class="org.apache.lucene.analysis.WhitespaceAnalyzer"> <property>mytext2</property> </analyzer> </analyzers> </configuration>
上文的内容均参考至http://wiki.apache.org/jackrabbit/IndexingConfiguration