索引的对象遵循以下原则:
实现默认的无参数构造器,不要是public的。便于compass采用Constants.newInstance()
提供identifier,
提供访问和设置方法
建议重载equals和hashcode方法。建议以业务主键为参考。

alias:每一个影射定义都注册了一个别名。这个别名用来联系类的osem定义和类本身。
Root:在compass中有两类可搜索的类:root searchable和non-root searchable 类。root searchable类最好定义作为hits结果返回的类。non-root searchable类不要求定义id影射。

子索引:默认情况下,每一个root searchable类都有自己的子索引,名称缺省为alias。子索引的名称也可以自由控制。允许几个root searchable类索引到相同的子索引中。或者用子索引hash功能。

searchable id不要求定义搜索的元数据,如果没有定义,compass自动创建内部的元数据id。如果searchable id不需要被搜索,那么需要为它定义一个可搜索元数据。注意下面的元数据定义方式:

@Searchable 
 
public class Author { 
 
@SearchableId(name = "id") 
 
private Long id; 
 
// ... 
 
} 
 

@Searchable 
 
public class Author { 
 
@SearchableId 
 
@SearchableMetaData(name = "id") 
 
private Long id; 
 
// 
 

Searchable Constant:允许对一个类定义一系列的的常量数据。对于添加静态元数据是非常有用的。 
 
<constant> 
 
<meta-data>type</meta-data> 
 
<meta-data-value>person</meta-data-value> 
 
<meta-data-value>author</meta-data-value> 
 
</constant>



Searchable Dynamic Meta Data:允许将表达式的结果保存到搜索引擎中。该影射不能影射任何类属性。动态元数据的值是根据动态转换器计算表达式得到的。compass内建了比如el,jexl,velocity,ognl,groovy等转换器。当定义表达式后。root 类被注册为data key下的值。

<dynamic-meta-data name="test" converter="jexl"> 
 
data.value + data.value2 
 
</dynamic-meta-data>



Searchable Reference:映射root类和其它类之间的关系。在marshals的过程中,只marshal参考对象的id。但是在unmarshal过程中根据id装载参考的对象。
compass在参考对象上不执行任何级联操作,也不提供延迟加载。

<class name="A" alias="a"> 
 
<id name="id" /> 
 
OSEM - Object/Search Engine Mapping 
 
Compass - Java Search Engine 40 
 
<reference name="b" /> 
 
<!-- ... --> 
 
</class> 
 
<class name="B" alias="b"> 
 
<id name="id" /> 
 
<!-- ... -->


</class>

Searchable Component:嵌入一个可搜索类到本身的搜索类中。组件参考搜索类能够设置为 Root。为Root的组件一般都是具有id属性。比如人员和姓名组件(non-root),人员和帐户(root)。

<class name="A" alias="a"> 
 
<id name="id" /> 
 
<component name="b" /> 
 
<!-- ... --> 
 
</class> 
 
<class name="B" alias="b" root="false"> 
 
<!-- ... --> 
 
</class>



继承处理:

<class name="A" alias="a"> 
 
<id name="id" /> 
 
<property name="aValue"> 
 
<meta-data>aValue</meta-data> 
 
</property> 
 
</class> 
 
<class name="B" alias="b" extends="a"> 
 
<property name="bValue"> 
 
<meta-data>aValue</meta-data> 
 
</property> 
 
</class>



Root 类有自己的索引,而依赖Root类的非Root类不需要索引。
Class mapping能够继承其它class mapping(可以超过一个)。也能够继承contract mapping。

contract:相当于java语言中的接口。如果有几个相同的类具有相似的属性。就可以定义一个contract。然后在子类中extend该contract。