<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Terry.Li-彬

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

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

    不久前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 禮物 閱讀(1037) 評論(0)  編輯  收藏 所屬分類: Hibernate Search

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

    網站導航:
     
    主站蜘蛛池模板: japanese色国产在线看免费| 亚洲综合av一区二区三区| 成人精品综合免费视频| 色吊丝永久在线观看最新免费| 亚洲sss综合天堂久久久| 在线精品一卡乱码免费| 久久久久亚洲av无码专区喷水| 免费女人高潮流视频在线观看| 亚洲高清国产拍精品26U| 国产一区二区免费| 亚洲最大福利视频网站| 99国产精品永久免费视频| 一本色道久久88—综合亚洲精品 | 亚洲va在线va天堂va888www| 国产色无码精品视频免费| 久久久久亚洲av无码专区导航| 99re在线视频免费观看| 亚洲春色另类小说| 无码高潮少妇毛多水多水免费| 久久久久亚洲AV无码去区首| 亚洲最大av无码网址| 免费人成黄页在线观看日本| 亚洲国产亚洲综合在线尤物| 成人片黄网站色大片免费| 黄色大片免费网站| 亚洲AV无码一区二区二三区软件 | 亚洲爱情岛论坛永久| 成人无码区免费A片视频WWW | 爽爽爽爽爽爽爽成人免费观看| 亚洲AV午夜福利精品一区二区 | 国产美女精品视频免费观看 | 美女被免费视频网站a国产| 黄床大片30分钟免费看 | 亚洲春色另类小说| 日批日出水久久亚洲精品tv| a毛片免费在线观看| 亚洲欧洲另类春色校园网站| 亚洲国产精品专区在线观看| 性色午夜视频免费男人的天堂| 亚洲精品美女久久7777777| 亚洲精品无码久久久久sm|