`

《compass-reference》翻译计划之6.3 检索类映射(一)

阅读更多

 

6.3   检索类映射

6.3.1   检索ID和检索元数据

每个root级的检索类至少定义1个检索ID。检索ID用于唯一识别该对象。用户能定义多个检索ID,也能把类当作一个检索ID(必须注册自己的转换器或者使用检索ID组件映射)。

 

一般来说,检索ID是不需要作为一个检索元数据来定义。如果用户没有定义检索IDCompass将创建一个内部的元数据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.CalendarCompass中的多种类型都被自动支持(请看类型转换章节相关的内容)。而且,也能使用自定义转换器来支持用户定义的类型。一个检索元数据使用检索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>

 

 

 

注:“《compass-reference》翻译计划”

 

 

 

 

 

4
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics