6.3 检索类映射
6.3.1 检索ID和检索元数据
每个root级的检索类至少定义1个检索ID。检索ID用于唯一识别该对象。用户能定义多个检索ID,也能把类当作一个检索ID(必须注册自己的转换器或者使用检索ID组件映射)。
一般来说,检索ID是不需要作为一个检索元数据来定义。如果用户没有定义检索ID,Compass将创建一个内部的元数据id(解析之后)——通常,基于代理id的文本搜索是不需要明确定义的。如果检索ID不必被搜索,那么必须为它定义一个检索元数据。当采用XML映射方式时,可以为检索ID定义1个或多个属性。当采用annotations时,有三个选项:第一是为检索ID提供一个name,第二是增加一个SearchableMetaData,最后是SearchableMetaDatas(为多个元数据)。当然,这三个选项是能组合使用的。Compass为了减少annotations的数量(避免 annotation “地狱”),使用了这样一个机制:一旦提供了name,检索ID将自动创建一个SearchableMetaData。
这里有一个使用annotations定义检索ID的例子。这个例子没有创建任何显式的元数据。
@Searchable
public class Author {
@SearchableId
private Long id;
// ...
}
对于同一个映射,我们来看一下使用XML方式的定义:
<class name="Author" alias="author"> <id name="id" /> <!-- ... --> </class>
接下来我们来看另一个例子——效果同前2个例子,此时显示定义了一个元数据:id:
@Searchable
public class Author {
@SearchableId(name = "id")
private Long id;
// ...
}
下面是采用SearchableMetaData达到同样效果的定义:
@Searchable
public class Author {
@SearchableId
@SearchableMetaData(name = "id")
private Long id;
// ...
}
同样效果的XML定义版本:
<class name="Author" alias="author"> <id name="id"> <meta-data>id</meta-data> </id> <!-- ... --> </class>
6.3.2 检索ID组件
一个检索ID组件表示一个合成对象,即一个id对象。除了它是作为该类的id外,它的使用方式与其它检索组件是相似的。接下来我们看一个使用annotations定义检索ID组件的例子(注意:在这个例子中,B不是一个root级的检索类,这里需要定义ids)。
@Searchable
public class A {
@SearchableIdComponent
private B b;
// ...
}
@Searchable(root = false)
public class B {
@SearchableId
private long id1;
@SearchableId
private long id2;
}
同样效果的XML展现方式:
<class name="A" alias="a"> <id-component name="b" /> <!-- ... --> </class> <class name="B" alias="b" root="false"> <id name="id1" /> <id name="id2" /> </class>
6.3.3 检索Parent
检索Parent映射对组件提供了循环映射的支持(尽管方向组件映射也被支持)。如果组件类想映射成包装类,那么父映射就能被用于映射它。父映射将不散列(数据持久化到搜索引擎中)父对象,当从搜索引擎中加载父对象时,只是初始化它。
下面是一个例子:使用annotations定义了一个检索组件和检索Parent(注意:在这个例子中,B不是一个root级的检索类,这里不需要定义ids)。
@Searchable
public class A {
@SearchableId
private Long id;
@SearchableComponent
private B b;
// ...
}
@Searchable(root = false)
public class B {
@SearchableParent
private A a;
// ...
}
同样效果的XML映射定义:
<class name="A" alias="a"> <id name="id" /> <component name="b" /> <!-- ... --> </class> <class name="B" alias="b" root="false"> <parent name="a" /> <!-- ... --> </class>
6.3.4 检索Property和检索元数据
从简单关联上看,一个检索Property可当作一个类的attribute或者property。检索property映射一个对象的attribute,最终会转成String存放在搜索引擎中。检索的类型包括原类型和包装类型,java.util.Date,java.util.Calendar和Compass中的多种类型都被自动支持(请看类型转换章节相关的内容)。而且,也能使用自定义转换器来支持用户定义的类型。一个检索元数据使用检索Property值(使用它注册的转换器,把它转换成String类型),通过一个名称,把它存储在索引中。
当使用XML映射时,对应一个property映射,可能会定义一个或多个元数据项。当使用annotation时,对应映射类的attribute,必须定义一个SearchableProperty。可以显示地定义一个SearchableMetaData或者SearchableMetaDatas(针对多个元数据)。如果没有定义SearchableMetaData(s),那么一个SearchableProperty将自动创建一个SearchableMetaData。
下面是使用annotations定义一个检索Property的例子。这个例子将根据类的域名自动创建一个同名的检索元数据。
@Searchable
public class Author {
// ...
@SearchableProperty
private String value;
// ...
}
同样效果的另一种表示方式(使用了显示的SearchableMetaData):
@Searchable
public class Author {
// ...
@SearchableProperty
@SearchableMetaData(name = "value")
private String value;
// ...
}
同样效果的XML映射定义:
<class name="Author" alias="author"> <! ... --> <property name="value"> <meta-data>value</meta-data> </property> <!-- ... --> </class>