《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
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:子索引雜湊。
-----------------------------------------------------------------------------------------