《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》翻译计划”