Compass概念:
1:Compass相當于hb的SessionFactory
2:CompassSession相當于hb的Session
3:CompassTransaction相當于hb的transaction。
Compass也是采用CompassConfiguration(裝載配置和映射文件)進行創建的。創建Compass時將會鏈接已經存在的索引或者創建一個新的索引。當Compass創建完后,就可以用compass得到compassSession。compassSession主要是起管理搜索引擎的數據。和hb的SessionFactory一樣,compass通常在系統啟動時創建,在所有compassSession創建時使用。
當使用CompassSession查詢數據時,將會返回CompassHits接口的實例。compassHits可以得到scores,resources和mapped objects.
Compass也提供了CompassTemplate和CompassCallback類處理會話和事務的處理。CompassTemplate template = new CompassTemplate(compass);
為了簡化CompassConfiguration的建立,compass提供了CompassConfigurationFactory類來建立CompassConfiguration
CompassConfiguration conf =CompassConfigurationFactory.newConfiguration();
除了通過xml文件設置外,可以通過CompassConfiguration.addXXX方法更改設置,也可以通過CompassSetting來設置。compassSetting和java 的Properties相似。也可以通過CompassEnvironment和LuceneEnvironment類來設置。
Compass中必須設置的項包括:compass.engine.connection。
一個重要的設置方面是組設置。如下面設置一個test的轉換器:
org.compass.converter.test.type=eg.TestConverter
org.compass.converter.test.param1=value1
org.compass.converter.test.param2=value2
所有的compass的操作性設置都可以定義在一個配置文件中,文件的名字默認為:compass.cfg.xml,如果取名不一樣這在初始化CompassConfiguration時,使用CompassConfiguration.config(fileName)。
因為索引是事務性的。所以在進行操作的過程中,就存在鎖的概念。可以設置鎖文件的位置,默認為java.io.tmp,<transaction lockDir="/shared/index-lock" />
別名、資源和屬性的概念:
資源(Resource):資源表示屬性的集合,相當于虛擬文檔。一個資源通常和一個別名聯系在一起,幾個資源可以屬于同一個別名。別名擔當資源和映射定義的聯系角色。屬性是指一個鍵值對。
在OSEM/XSEM中,容易忽視的是資源在何處被使用,因為處理內容都被轉換成應用程序的模型或者是xml的結構數據。資源很少被使用。
通過資源和屬性,可以采用統一的方式訪問相同語義的模型。比如應用程序中有兩個模型:學生和教師。我們將學生和教師的名字都設置成相同語義的元數據:name(資源屬性名),這樣將會允許我們所有的name搜索顯示結果在資源層次上。
分析器:該組件主要是預處理輸入文本。用于搜索和索引的文本分析上。要求搜索和索引使用相同的分析器。
Compass內置兩個分析器名稱:default和search。缺省分析器用戶沒有其它分析器配置時使用。search用于搜索查詢的分析。
配置定制的分析器的參數可以通過Setting方式置入:
<analyzer name="deault" type="CustomAnalyzer" analyzerClass="eg.MyAnalyzer">
<setting name="threshold">5</setting>
</analyzer>
分析過濾器:
分析過濾器能夠被不同的分析器穿插使用。配置如下:
<analyzer name="deafult" type="Standard" filters="test1, test2" />
<analyzerFilter name="test1" type="eg.AnalyzerTokenFilterProvider1">
<setting name="param1" value="value1" />
</analyzerFilter>
<analyzerFilter name="test2" type="eg.AnalyzerTokenFilterProvider2">
<setting name="paramX" value="valueY" />
</analyzerFilter>
同義處理:同義處理分析過濾器:返回給定詞的同義詞
<analyzer name="deafult" type="Standard" filters="synonymFilter" />
<analyzerFilter name="synonymFilter" type="synonym">
<setting name="lookup" value="eg.MySynonymLookupProvider" />
</analyzerFilter>
查詢分析器:
<queryParser name="test" type="eg.MyQueryParser">
<setting name="param1" value="value1" />
</queryParser>
索引文件的結構:
compass的子索引相當于lucene的一個索引。當compound設置為true時,lucene次采用一個segments文件存儲所有索引內容。子索引對事務型操作尤為重要。
compass支持read_committed和serializable、batch_insert級別的事務
compass事務鎖用在自索引級別上,這意味著臟操作只發生在各自的子索引上。
compass事務在臟操作(創建,保存,刪除)時要求一個鎖。搜索時應該只用read only事務。鎖超時一般設置為10秒。
<transaction lockTimeout="15" lockPollInterval="200" />
事務隔離:
1:read_committed:當開始該事務時,是不需要鎖的。因此速度會快。
2:serializable:和上面一樣。只是當事務開始時,對所有的自索引有一個鎖。性能降低。
3:batch_insert:使用了lucene提供的快速的批量索引的功能。這個事務操作只支持create操作。如果已經有同名的別名和ids的資源已經存在,那么將會在一個索引中出現兩個資源。這種事務是不能回滾的。
FS Transaction Log:存儲許多事務數據到文件系統中。
<transaction isolation="read_committed">
<readCommittedSettings>
<fsTransLog path="/tmp" readBufferSize="32" writeBufferSize="4098" />
</readCommittedSettings>
</transaction>
常量子索引hash:
影射別名到子索引的最簡單辦法是將某個別名的所有的可搜索內容索引到相同的子索引里面。如:
<compass-core-mapping>
<[mapping] alias="test-alias" sub-index="test-subindex">
<!-- ... -->
</[mapping]>
</compass-core-mapping>
test-alias將會影射所有的實例到test-subindex子索引中。如果sub-index沒有定義,則將缺省為alias。
Modulo Sub Index Hashing:允許將一個別名代表的實例索引到不同的子索引中。根據給定的大小對索引進行分割。文件名是給定的前綴+“_"+數字。
<compass-core-mapping>
<[mapping] alias="A">
<sub-index-hash type="org.compass.core.engine.subindex.ModuloSubIndexHash">
<setting name="prefix" value="test" />
<setting name="size" value="2" />
</sub-index-hash>
<!-- ... -->
</[mapping]>
</compass-core-mapping>
會產生[test_0]和[test_1]兩個子索引文件。
Custom Sub Index Hashing:
ConstantSubIndexHash?和 ModuloSubIndexHash都實現了compass的SubIndexHash接口。定制子索引hash必須實現getSubIndexes和mapSubIndex(String alias,Property[] ids)兩個方法。
Optimizers:優化器,每個臟操作提交成功都會在各自的子索引中產生另一個segment,子索引中的segment越多,搜索操作就越慢,因此保持索引優化,控制segment的數量很重要。要做的就是合并小segment到大的segment 。
索引優化器在子索引級別執行。在優化的過程中,優化器將鎖定子索引,以便于臟操作。
調度優化:compass的每一個優化器都能包裝為調度方式執行。
<optimizer scheduleInterval="90" schedule="true" />
Aggressive Optimizer:通過設置segments的大小,當達到指定的大小時,將所有的segement合并到一個segment。這樣搜索的效率最高。
Adaptive Optimizer:和Aggressive Optimizer不同的是,該優化器只合并新的小segment。
Null Optimizer:不做任何優化。當做batch_insert事務時,離線創建索引或已經全部優化索引,一般使用它。
直接訪問Lucene:compass提供了LuceneHelper類,該類可以直接訪問lucene的api。
posted on 2006-12-01 16:38
不做浮躁的人 閱讀(2739)
評論(0) 編輯 收藏