1. 程式人生 > >《compass-reference》翻譯計劃之6.3 檢索類對映(一)

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