Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(19)

          隨筆分類(107)

          隨筆檔案(141)

          文章分類(284)

          文章檔案(342)

          相冊

          收藏夾(58)

          家裝

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

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

          Hibernate Search運行的環境如下:

          1、JDK或JRE 5.0以上

          2、Hibernate-Search以及相應的依賴包

          3、Hibernate Core 3.2.X

          4、Hibernate Annotations 3.3.X

          一、配置

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

          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代表索引文件默認的保存位置。

          這些屬性設置完成后,接下來就是使用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用于標示需要建立全文索引的實體類,它包含一個屬性index用于標示這個全文索引的名字

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

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


          二、建立索引

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

          1、Configuration

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

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

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

          2、Session

          要使用Hibernate Search的功能就不能單純使用平常的Session來開始事務,進行數據庫操作,而是應該改用FullTextSession

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

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


          三、檢索

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

          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();??

          首先是建立相應的QueryParser由他來對輸入的關鍵字進行切分后產生Lucene下的Query實例,最后通過 FullTextSession的createFullTextQuery方法生成hibernate下的Query實例,執行list方法即可獲得查詢 的實例結果集合。

          四、完

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

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

          網站導航:
           
          主站蜘蛛池模板: 雷州市| 邢台县| 永泰县| 定陶县| 靖江市| 鄱阳县| 洛浦县| 满洲里市| 桃江县| 益阳市| 竹山县| 临清市| 电白县| 福泉市| 驻马店市| 商河县| 安平县| 铜山县| 玛纳斯县| 柯坪县| 苍南县| 耿马| 湘乡市| 鸡泽县| 高密市| 新龙县| 如东县| 察隅县| 庆安县| 泸西县| 巴马| 徐州市| 隆安县| 独山县| 疏勒县| 紫云| 辛集市| 滦平县| 西乌珠穆沁旗| 西乌| 岚皋县|