Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks

          不久前Hibernate推出了Hibernate Search 3.0 GA,由它的名字大家也可以大概猜到它的作用是對數(shù)據(jù)庫中的數(shù)據(jù)進行檢索的。它是hibernate對著名的全文檢索系統(tǒng)Lucene的一個集成方案,作 用在于對數(shù)據(jù)表中某些內(nèi)容龐大的字段(如聲明為text的字段)建立全文索引,這樣通過hibernate search就可以對這些字段進行全文檢索后獲得相應(yīng)的POJO,從而加快了對內(nèi)容龐大字段進行模糊搜索的速度(sql語句中l(wèi)ike匹配)。

          Hibernate Search運行的環(huán)境如下:

          1、JDK或JRE 5.0以上

          2、Hibernate-Search以及相應(yīng)的依賴包

          3、Hibernate Core 3.2.X

          4、Hibernate Annotations 3.3.X

          一、配置

          使用過Lucene的人都知道,Lucene是使用Directory這個概念來存儲索引文件的,所以在Hibernate Search中提供了一個初始化、配置化的工廠類DirectoryProvider來生成相應(yīng)的Directory。而在這里,我使用了 FSDirectoryProvider這個工廠類,其中FS代表文件系統(tǒng),意思是索引文件保存在文件系統(tǒng)中。因此,我們在hibernate.cfg.xml文件中加入了一下內(nèi)容:

          xml 代碼
          1. < property ? name = "hibernate.search.default.directory_provider" > ??
          2. ??????????org.hibernate.search.store.FSDirectoryProvider ??
          3. </ property > ??
          4. < property ? name = "hibernate.search.default.indexBase" > ??
          5. ??????????E:/temp/index ??
          6. </ property > ??

          其中屬性hibernate.search.default.indexBase代表索引文件默認(rèn)的保存位置。

          這些屬性設(shè)置完成后,接下來就是使用Annotation對指定POJO的指定屬性進行配置了。如下:

          java 代碼
          1. @Indexed (index?=? "text" ) ??
          2. public ? class ?Text? implements ?java.io.Serializable ??
          3. { ??
          4. ???? @DocumentId ??
          5. ???? private ?Integer?id; ??
          6. ??
          7. ???? private ?String?fileName; ??
          8. ??
          9. ???? private ?String?filePath; ??
          10. ??
          11. ???? @Field (name?=? "content" ,?store?=?Store.NO,?index?=?Index.TOKENIZED,?analyzer?=? @Analyzer (impl?=?ChineseAnalyzer. class )) ??
          12. ???? private ?String?content; ??
          13. ??
          14. ????...... ??
          15. }??

          其中@Indexed用于標(biāo)示需要建立全文索引的實體類,它包含一個屬性index用于標(biāo)示這個全文索引的名字

          @DocumentId用于標(biāo)示實體類中的唯一的屬性保存在索引文件中,是當(dāng)進行全文檢索時可以這個唯一的屬性來區(qū)分索引中其他實體對象,一般使用實體類中的主鍵屬性

          @Field就是用來標(biāo)示Lucene的Field字段,其中name屬性用于標(biāo)示Field的名稱,store屬性用于標(biāo)示這個屬性的內(nèi)容是否需要保存在索引中,index屬性標(biāo)示該字段屬性是否進行分詞(Index.TOKENIZED),analyzer用于標(biāo)示建立索引時所使用的分析器是什么類,這里使用Lucene自帶的ChineseAnalyzer


          二、建立索引

          配置完成以上設(shè)置之后,Hibernate Search的配置工作算是大功告成了,剩下的就是如何在編碼時使用到Hibernate Search。其實Hibernate Search的使用與我們平時Hibernate的使用基本一致,索引的建立工作是可以由Hibernate Search后臺自動處理的,無需手工操作,其中的主要差別有

          1、Configuration

          由于本文中Hibernate Search配置是由Annotation來完成的,所以我們在初始化Configuration、SessionFactory、Session時應(yīng)該這樣寫:

          java 代碼
          1. factory?=? new ?AnnotationConfiguration().configure(file).buildSessionFactory();??

          使用AnnotationConfiguaration來代理平常使用的Configuration

          2、Session

          要使用Hibernate Search的功能就不能單純使用平常的Session來開始事務(wù),進行數(shù)據(jù)庫操作,而是應(yīng)該改用FullTextSession

          java 代碼
          1. //獲取Session ??
          2. Session?session?=?HibernateUtil.getSession(); ??
          3. //封裝Session為FullTextSession ??
          4. FullTextSession?fullTextSession?=?Search.createFullTextSession(session); ??
          5. ??
          6. //開始事務(wù) ??
          7. Transaction?tx?=?fullTextSession.beginTransaction(); ??
          8. ??
          9. ...... ??
          10. ??
          11. //提交事務(wù) ??
          12. tx.commit(); ??
          13. //關(guān)閉會話 ??
          14. fullTextSession.close();??

          這樣,我們使用FullTextSession進行save,update,delete操作hibernate search將會自動根據(jù)配置在后臺對相應(yīng)的域建立全文索引了


          三、檢索

          接下來就是說一下如何使用全文檢索功能來檢索實體對象了。

          java 代碼
          1. Session?session?=?HibernateUtil.getSession(); ??
          2. FullTextSession?fullTextSession?=?Search.createFullTextSession(session); ??
          3. ??
          4. Transaction?tx?=?fullTextSession.beginTransaction(); ??
          5. ??
          6. QueryParser?parser?=? new ?QueryParser( "content" ,? new ?ChineseAnalyzer()); ??
          7. ??
          8. Query?query?=?fullTextSession.createFullTextQuery(parser.parse(word), ??
          9. ????????Text. class ); ??
          10. ??
          11. List?result?=?query.list(); ??
          12. for ?( int ?i?=? 0 ;?result?!=? null ?&&?i?<?result.size();?i++) ??
          13. { ??
          14. ????Text?pojo?=?(Text)?result.get(i); ??
          15. ????System.out.println( "文件名:" ?+?pojo.getFileName()); ??
          16. ????System.out.println( "文件路徑:" ?+?pojo.getFilePath()); ??
          17. ????System.out.println(); ??
          18. } ??
          19. ??
          20. tx.commit(); ??
          21. fullTextSession.close();??

          首先是建立相應(yīng)的QueryParser由他來對輸入的關(guān)鍵字進行切分后產(chǎn)生Lucene下的Query實例,最后通過 FullTextSession的createFullTextQuery方法生成hibernate下的Query實例,執(zhí)行l(wèi)ist方法即可獲得查詢 的實例結(jié)果集合。

          四、完

          posted on 2010-09-03 08:46 禮物 閱讀(1037) 評論(0)  編輯  收藏 所屬分類: Hibernate Search

          只有注冊用戶登錄后才能發(fā)表評論。

          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 舒城县| 榆中县| 沁源县| 全州县| 玉溪市| 台南县| 营口市| 云南省| 宝坻区| 修武县| 成都市| 吴川市| 廉江市| 巩义市| 信宜市| 胶南市| 广昌县| 海林市| 泊头市| 沙湾县| 英德市| 木兰县| 鹿泉市| 新源县| 聂荣县| 尚志市| 福贡县| 云霄县| 大理市| 镶黄旗| 汨罗市| 女性| 太湖县| 东乌| 洮南市| 武宁县| 东莞市| 凭祥市| 儋州市| 保靖县| 石首市|