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