1. 程式人生 > >《compass-reference》翻譯計劃之:6.1 OSEM介紹 6.2 檢索類

《compass-reference》翻譯計劃之:6.1 OSEM介紹 6.2 檢索類

6 OSEM – 物件/搜尋引擎對映

6.1    介紹

Compass提供了把Java物件對映到搜尋引擎中的功能,這是通過XML對映檔案和Java5.0Annotations來實現的。我們把這個技術稱為OSEM(物件搜尋引擎對映)。OSEM提供了一個非常豐富的語法來描述物件的屬性和關係。通過CompassOSEM檔案/annotations從執行期的物件模型中抽象出需要的屬性,然後把它們對應的元資料插入到搜尋引擎索引中。

 

儲存一個物件到搜尋引擎的過程稱為marshaling(列集),而從搜尋引擎中檢索一個物件的過程稱為un-marshaling

。正如5.2“Alias, Resource and Property”中的描述,在搜尋引擎的實現中,Compass使用了ResourcesOSEMmarshalingun-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類採用Java5annotations方式來進行對映。接下來,我們再看一個採用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         如果你想混用持久類中的物件(例如在一個Setadd不同的持久類),那麼建議你過載equals() hashCode()。你能通過這些物件之間的識別符號來實現這種混用,但得注意:使用代理識別符號能使Compass工作得最好(將提供一個方法來自動生成它們)。因此,使用業務鍵來實現是最好的。

 

在上面的例子中,我們為Author類定義了對映。從中引入了Compass的對映概念和語法。在解釋概念之前,弄清楚一些相關術語是很有必要的。

 

首先要明確的是Property的用法。因為Property作為一個javaCompass的概念(從表示搜尋引擎和語義術語來看),它有共同的用法——特別注意的是其所帶字首的含義。一個類的property指的是一個Java類的屬性。在Compass中,一個資源的property指的是搜尋引擎元資料,它包含了這個對映類的property值。在前面的OSEM例子中,類property:“name”的值所對映的包含了兩個資源property例項:nameauthorname

 

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》翻譯計劃”