《compass-reference》翻译计划之:6.1 OSEM介绍 6.2 检索类

第6章 OSEM – 对象/搜索引擎映射

6.1    介绍

Compass提供了把Java对象映射到搜索引擎中的功能,这是通过XML映射文件和Java5.0的Annotations来实现的。我们把这个技术称为OSEM(对象搜索引擎映射)。OSEM提供了一个非常丰富的语法来描述对象的属性和关系。通过Compass,OSEM文件/annotations从运行期的对象模型中抽象出需要的属性,然后把它们对应的元数据插入到搜索引擎索引中。

 

保存一个对象到搜索引擎的过程称为marshaling(列集),而从搜索引擎中检索一个对象的过程称为un-marshaling。正如5.2:“Alias, Resource and Property”中的描述,在搜索引擎的实现中,Compass使用了Resources。OSEM是marshaling和un-marshaling一个对象树到Resource的过程(简单的说,一个Resource就是一个映射)。

 

 

6.2    检索类   

检索类是描述应用状态的类,它实现了业务模型的实体。Compass最适合POJO模式编程。现在,我们来看一个检索类的实例:

 

import java.util.Date;
import java.util.Set;

@Searchable
@SearchableConstant(name = "type", values = { "person", "author" })
public class Author {
	private Long id; // identifier

	private String name;

	private Date birthday;

	@SearchableId
	public Long getId() {
		return this.id;
	}

	private void setId(Long id) {
		this.id = id;
	}

	@SearchableProperty(name = "name")
	@SearchableMetaData(name = "authorName")
	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@SearchableProperty(format = "yyyy-MM-dd")
	public Date getBirthday() {
		return this.birtday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}

 

 

 

 

Author类采用Java5的annotations方式来进行映射。接下来,我们再看一个采用XML映射的例子:

<?xml version="1.0"?>
<!DOCTYPE compass-core-mapping PUBLIC
"-//Compass/Compass Core Mapping DTD 2.0//EN"
"http://www.compass-project.org/dtd/compass-core-mapping-2.0.dtd">
<compass-core-mapping package="eg">
	<class name="Author" alias="author">
		<id name="id" />
		<constant>
			<meta-data>type</meta-data>
			<meta-data-value>person</meta-data-value>
			<meta-data-value>author</meta-data-value>
		</constant>
		<property name="name">
			<meta-data>name</meta-data>
			<meta-data>authorName</meta-data>
		</property>
		<property name="birthday">
			<meta-data format="yyyy-MM-dd">birthday</meta-data>
		</property>
	</class>
</compass-core-mapping>

 

 

 Compass使用的应用对象是非侵入式,它必须具有以下规则:

l         实现一个默认的构造方法:Author有一个隐藏的(无参)构造方法。所有的持久类都必须有一个默认的构造方法。Compass Core中使用Constructor.newInstance()来构造实例。

l         提供属性标识符:在OSEM中,每个root级的检索类必须定义一个或多个属性来标识该类。

l         访问说明和变更(可选):虽然Compass能直接持久化实例变量,但Compass不推荐你这么做。Compass更认可JavaBean风格的实现方式。这种方式更清晰明了。

l         如果你想混用持久类中的对象(例如在一个Set中add不同的持久类),那么建议你重载equals()和 hashCode()。你能通过这些对象之间的标识符来实现这种混用,但得注意:使用代理标识符能使Compass工作得最好(将提供一个方法来自动生成它们)。因此,使用业务键来实现是最好的。

 

在上面的例子中,我们为Author类定义了映射。从中引入了Compass的映射概念和语法。在解释概念之前,弄清楚一些相关术语是很有必要的。

 

首先要明确的是Property的用法。因为Property作为一个java和Compass的概念(从表示搜索引擎和语义术语来看),它有共同的用法——特别注意的是其所带前缀的含义。一个类的property指的是一个Java类的属性。在Compass中,一个资源的property指的是搜索引擎元数据,它包含了这个映射类的property值。在前面的OSEM例子中,类property:“name”的值所映射的包含了两个资源property实例:name和authorname。

 

6.2.1   别名

 

在Compass中,每个映射定义都得注册一个别名。这个别名用于连接一个类和它的OSEM定义。在其他映射定义和直接使用Compass API时,别名也能被引用。当使用annotations映射时,别名就是该类的小写类名。

 

6.2.2   Root

在Compass中,检索类有两种类型:root级和非root级。当一个类需要被单独搜索时,该类最好定义成Root级检索类。例如:在Customer类中,包含一个Name类,Customer能被单独查询,而Name仅仅是Customer中的一部分,所以Customer被定义成root级检索类,而Name被定义成非root级检索类(在配置文件中root=”false”)。另外一种考虑root级检索类的方式:最终编组到自己的资源的检索类。

 

非root级检索类不需要定义id映射。

 

6.2.3   子索引

默认情况下,每个root级的检索类都有其自身并以别名命名的子索引。子索引名是可控的。允许把几个root级的检索类加入到同一个子索引中。也可以在同一个子索引中使用不同的子索引散列函数。想了解更多内容,请阅读:5.8:子索引散列。

-----------------------------------------------------------------------------------------

 

 

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

 

相关推荐