映射文件中元素分析:
1、 类别名
l 每个检索类在通用元数据定义文件中都应该有对应描述。
<class name="Book" alias="${library.book}">
alias属性所对应的值起到了一个映射作用。它将一个实体与这个实体的元数据定义连接起来。该元数据定义在.cmd.xml文件中。
在library.cmd.xml文件中对应的:
<alias id="book" displayName="Book">
<description>Book alias</description>
<uri>http://compass/sample/library/alias/book</uri>
<name>book</name>
</alias>
很显然,其中使用了3个元数据来定义这个检索类。它们分别是<description>、<uri>和<name>。
2、<id name="id" />。
每一个root级的检索类至少有一个索引id。可以用annotation和xml配置的方式注册该索引id。如果没有注册,compass会默认给一个内部id。
3、property
<property name="keywords">
<meta-data boost="2">${library.keyword}</meta-data>
</property>
l Property对应检索类中的域。
l 每个索引域在通用元数据定义文件中都应该有对应的别名。
其中meta-data中的boost=2是指多重引导关系(= bootstrap)。
1、<constant>
用<constant>可以构建索引常量。可以在类中用annotation的方式注入,也可以在xml文件中定义。
索引常量的xml定义方式:在一个索引实体的映射文件中通过<constant>定义一个常量名,并用一列值与之对应。
<constant>
<meta-data>${library.type}</meta-data>
<meta-data-value>${library.type.mdPerson}</meta-data-value>
<meta-data-value>${library.type.mdAuthor}</meta-data-value>
</constant>
结合通用元数据定义文件,我们可以翻译一下,结果如下:
<constant>
<meta-data>type</meta-data>
<meta-data-value>person</meta-data-value>
<meta-data-value>author</meta-data-value>
</constant>
由此可以得到一个索引常量元数据:type,它有2个对应的值:person和author。
2、<component>和<reference>
<component name="name" ref-alias="${library.article}" />
该类中定义了三个与Author关联的类或者由类组成List。
private Name name;
private List articles = new ArrayList();
private List books = new ArrayList();
其中Article属于非root型的检索类,而Name是属于辅助类,所以它们跟Author之间的关系都是:component。而Book是root型的检索类,它跟Author之间的关系只能是:reference。
不能单独搜索Article和Name,必须通过Author来调用它们。
注:很明显该映射文件的以下部分设置有误:
<component name="name" ref-alias="${library.name.md}" />
应该改成:<component name="name" ref-alias="${library.name}" />
至于为什么配置错了还不影响结果,没有仔细看其源代码,所以不得知。有人明白其中道理的,不妨一说,愿洗耳恭听:)
1、<class>
<class name="Article" alias="${library.article}" root="false">
其中root="false"的含义:
root属性是用于标识该实体是否为一个可以被独立查找的检索实体。当该属性的值为true时,用户可以直接通过关键字的查找来得到这样的实体信息;若该属性的值为false,用户使用相同的关键字进行搜索,只能得到该实体所依附的真正实体的实体。这时,需要再通过该真正实体的实例,进一步获取所需要的实体。
本例来看,用户可以通过输入关键字在Compass进行查找,最终找到Author和Book这样的实体对象,却不可以直接得到Article这个对象。因为Article的root属性为false。如果需要取得Article的实例,则只能先取得Author的实例,进而通过Author中的articleList,来获取Article的对象。
<class>的root属性默认为true。
1、概述
Library.cmd.xml文件中的cmd是Common Metadata Definition的缩写。其中,元数据是用于描述数据的数据。在该文件中,存储了一些与实体相关的元数据信息。同时,在*.cpm.xml文件中,所有被使用到的变量都在这里有明确的定义。即那些通过${library.*}调用的。
2、uri
在该定义文件中<meta-data>的uri是可以重复的,例如以下2个定的uri是相同的:
<alias id="name" displayName="Name">
<description>Name alias</description>
<uri>http://compass/sample/library/alias/name</uri>
<name>name</name>
</alias>
---------------------------------------------------
<meta-data id="isbn" displayName="ISBN">
<description>ISBN of the book</description>
<uri>http://compass/sample/library/name</uri>
<name>name</name>
</meta-data>
通过测试类,我们可以了解Compass索引建立和检索的全过程。
对于test*()方法我们就不作主要关注,那些都是单元测试的方法。不过,这也算是提供了写compass应用时的单元测试范例。
我们从main方法进入,看看compass运行的过程: