原貼地址:
? 已加入
Opensymphony的
Compass 是對(duì)
Lucene搜索引擎在企業(yè)應(yīng)用(數(shù)據(jù)庫應(yīng)用)中的增強(qiáng)。 Lucene本身的API已經(jīng)非常簡(jiǎn)單,看看IBM DW上的
Beef up Web search apps with Lucene已經(jīng)大概了解,那Compass還能做什么樣的增強(qiáng)呢?
???? 1.在我的項(xiàng)目里,最實(shí)際的增強(qiáng)就是Data Mirror功能。
????? DataMirror會(huì)把數(shù)據(jù)庫的增刪改變化實(shí)時(shí)映射到索引文件中。如果你采用Hibernate等ORM方案,你只須在POJO中進(jìn)行annotation注釋,Compass就會(huì)與Hibernate的event機(jī)制結(jié)合,或者使用AOP的方式,自動(dòng)在數(shù)據(jù)庫增刪改時(shí)變更索引;如果你只是采用JDBC,也可以在XML文件配置Table Mapping或ResultSet Mapping,指定version列,Compasss定時(shí)進(jìn)行索引更新。而且,Compass還支持事務(wù),在查詢數(shù)據(jù)庫遍歷結(jié)果集的過程中如果出現(xiàn)異常,會(huì)在Index Segments 文件一級(jí)進(jìn)行事務(wù)控制。
??? 如果沒有Compass,我們一般會(huì)在每天深夜重建一次索引。相比Compass的做法,
??? 一來反應(yīng)遲緩,平均延時(shí)半天;
??? 二來效率沒有Compass高。如果采用完全重建索引,效率就不用說了。如果進(jìn)行增量索引,就要增加一個(gè)字段,在數(shù)據(jù)更新時(shí)進(jìn)行特殊的處理,刪除時(shí)也不能直接刪除數(shù)據(jù),要等lucene刪完索引它才能刪除,這樣Lucene對(duì)應(yīng)用就非常不透明了。
??? 三來不支持事務(wù),如果建立索引過程中出現(xiàn)異常,索引文件的狀態(tài)是不可控的。
??? 2.Compass對(duì)查詢的API也作了一定簡(jiǎn)化,可以考慮使用。
??? 詳見參考文檔 10.5 Searching, 簡(jiǎn)單直接用session find,如
CompassHits?hits?=?session.find("name:jack");
???加入排序,改分詞Analyzer,用QueryBuilder()
CompassHits?hits?=?session.createQueryBuilder()
??.queryString("+name:jack?+familyName:london")
????.setAnalyzer("an1")?//?use?a?different?analyzer
??.toQuery()
????.addSort("familyName",?CompassQuery.SortPropertyType.STRING)
??.hits();

3. Compass的其他功能,用不用的上要看緣份了:?
?? 將Lucene的索引文件放入數(shù)據(jù)庫或內(nèi)存。
?? 對(duì)索引文件根據(jù)不同的主題分開subIndex。
???對(duì)XML數(shù)據(jù)進(jìn)行映射和索引....
4.一段Pragmatic的Compass 搜索程序是這樣寫的:
1.用annotation將pojo映射為searchable。(詳細(xì)請(qǐng)看參考文檔,如果沒有JDK5,可以參考XML式的配置)
public?class?Product??{??
?@SearchableId
?private?Integer?id;
?private?String?name;
?@SearchableProperty(name?=?"name")
????public?String?getName()?{
????????return?this.name;
????}
}
2.用Compass提供的Spring2 Schema 來配置Compass與Hibernate,Spring的結(jié)合。
???SchemaBase的配置是Spring 2.0的新特征,相比原來的配置代碼要少一些。
3.編寫搜索結(jié)果顯示頁,將Hits,Command,Page三個(gè)變量顯示出來。
?? Compass的代碼重用已經(jīng)到了Controller一級(jí),只要給Controller 配上compass bean和結(jié)果顯示的jsp就可以了。Controller提供足夠的配置參數(shù),使它完全可以被配置重用,這是個(gè)值得SpringSide學(xué)習(xí)的地方。
? ?即使你的web應(yīng)用不是采用Spring MVC,如果沒有大規(guī)模改寫的需求,也可以直接使用,讓Struts與Spring MVC并存。
?5.Controller默認(rèn)的查詢需要擴(kuò)展時(shí)
??? Contrller默認(rèn)的查詢是在所有fileld里查詢關(guān)鍵字,如果需要限定field,加入排序,加入and ,exclude,模糊查詢等就不適用了。高級(jí)搜索頁一般會(huì)提供比較多的過濾條件輸入框讓用戶輸入,然后在Controller對(duì)這些輸入條件進(jìn)行重新組合。
??? 組合的方式既可以按??? 也可以用類似Hibernate Criteria API的方式,如:
CompassHits?hits?=??session.createQueryBuilder().bool()
????.addMust(?queryBuilder.term("name",?"jack")?)
????.addMustNot(?queryBuilder.term("familyName",?"london")?)
??.toQuery()?.hits();
??? 因此,如果你的Lucene應(yīng)用是面向數(shù)據(jù)庫的,就不妨用一下Compass。
???? Compass另一個(gè)讓我學(xué)習(xí)的地方是它充分考慮用戶客戶化的需要,enough thing can be configure ,從而連Controller也可以重用的做法。?
posted on 2006-11-09 11:07
OMG 閱讀(648)
評(píng)論(0) 編輯 收藏 所屬分類:
Compass/Lucene