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







3. Compass的其他功能,用不用的上要看緣份了:?
?? 將Lucene的索引文件放入數據庫或內存。
?? 對索引文件根據不同的主題分開subIndex。
???對XML數據進行映射和索引....
4.一段Pragmatic的Compass 搜索程序是這樣寫的:
1.用annotation將pojo映射為searchable。(詳細請看參考文檔,如果沒有JDK5,可以參考XML式的配置)
?@SearchableId
?private?Integer?id;
?private?String?name;
?@SearchableProperty(name?=?"name")
????public?String?getName()?{
????????return?this.name;
????}
}
2.用Compass提供的Spring2 Schema 來配置Compass與Hibernate,Spring的結合。
???SchemaBase的配置是Spring 2.0的新特征,相比原來的配置代碼要少一些。
3.編寫搜索結果顯示頁,將Hits,Command,Page三個變量顯示出來。
?? Compass的代碼重用已經到了Controller一級,只要給Controller 配上compass bean和結果顯示的jsp就可以了。Controller提供足夠的配置參數,使它完全可以被配置重用,這是個值得SpringSide學習的地方。
? ?即使你的web應用不是采用Spring MVC,如果沒有大規模改寫的需求,也可以直接使用,讓Struts與Spring MVC并存。
?5.Controller默認的查詢需要擴展時
??? Contrller默認的查詢是在所有fileld里查詢關鍵字,如果需要限定field,加入排序,加入and ,exclude,模糊查詢等就不適用了。高級搜索頁一般會提供比較多的過濾條件輸入框讓用戶輸入,然后在Controller對這些輸入條件進行重新組合。