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

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

    網站導航:
     
    主站蜘蛛池模板: 久久精品九九亚洲精品| 国产AⅤ无码专区亚洲AV| 亚洲第一网站免费视频| 日韩精品无码免费专区午夜不卡| 亚洲第一黄片大全| 一区二区三区免费在线视频| 最新国产成人亚洲精品影院| 亚洲视频免费观看| 亚洲一区在线视频观看| 毛片免费在线播放| 亚洲七久久之综合七久久| 日韩免费a级在线观看| 国产精品亚洲а∨无码播放麻豆| 国产乱色精品成人免费视频| 日本精品久久久久久久久免费| 亚洲麻豆精品国偷自产在线91| 成人免费一区二区三区| 亚洲国产精品特色大片观看完整版| 久久精品成人免费观看| 亚洲国产精品无码久久久| 免费毛片在线视频| 成人福利在线观看免费视频| 日本亚洲视频在线 | 亚洲AV无码乱码在线观看性色扶| 男人和女人高潮免费网站| 国产亚洲一区二区三区在线不卡| 久久久久久AV无码免费网站下载| 亚洲国产成人精品无码一区二区 | 久久国产亚洲高清观看| 免费可以看黄的视频s色| 久久亚洲AV成人无码国产电影| 久久久久一级精品亚洲国产成人综合AV区 | 一级毛片大全免费播放| 亚洲AV永久无码区成人网站| 成人免费午夜无码视频| 人碰人碰人成人免费视频| 中文字幕亚洲第一在线| 国产在线观看免费视频播放器| 国产在线观看免费视频软件| 2020国产精品亚洲综合网 | 亚洲区日韩区无码区|