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

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

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

    笨笨的思想片斷

    零碎片斷,雜七雜八。
    posts - 25, comments - 79, trackbacks - 0, articles - 0

    中文全文檢索的實現以及一些經驗(Java)

    Posted on 2007-07-30 17:55 笨笨 閱讀(5398) 評論(10)  編輯  收藏 所屬分類: Java

    中文全文檢索的實現以及一些經驗(Java)


    最近在項目中面臨中文全文檢索的需求,關鍵需求如下:

    1 支持中文、英文字詞的全文檢索,待檢索文本是古文言文。
    2 全文檢索表達式支持: AND,OR,NOT,NEAR,BEFORE 運算符,支持()。
    3 速度要求:400M文本,要求在2-5秒內能夠檢索完畢。



    嘗試Lucene以及放棄原因:

    在嘗試Lucene和不同的中文Analyzer后,終告放棄。
    原因如下:
    由于待檢索文本是古文,中文分詞技術無法派上用場。在將分隔存儲每個漢字后,發現從Lucene中檢索到的文本遠遠少于關鍵字實際匹配的文本,這一問題對于較長的檢索關鍵字尤其明顯。
    因為對于檢索準確程度要求很高,故此放棄,但是Lucene出的這個問題的原因尚不清楚,希望能夠有人提出解答。



    自行實現中文全文檢索原理以及方法:

    1 構建過程,忽略標點符號,自行計算每個漢字在每個文本文件中的偏移量,并保存。
    2 檢索過程,定位每個漢字的偏移量,如果檢索表達式中每個漢字的預期偏移量與實際偏移量吻合,則匹配成功。
    3 采用 MappedByteBuffer 加快檢索速度,采用二分查找加快偏移量匹配速度,3個左右的關鍵字復合檢索能夠在1秒內完成匹配(要求操作系統有足夠大的緩存)。


    目前實現的一些局限和優勢:

    0 中文檢索速度足夠,準確度比Lucene高(如果有高手能夠解決這個問題,我會很高興的廢棄掉這些類的)
    1 合適于中文,不適用英文文本
    2 全文檢索索引文件與原始文本文件的大小大約為2:3-3:4之間,300M大小,比Lucene大約多30M。
    3 索引文件的構建時間長,400M大約需要3小時,同時由于如果任何文本文件更新,都需要重新構建索引文件,
    因此不合適要經常變化的文本索引。




    全文檢索代碼示例(TestFullTextQuery.java):
    File storeDir = new File("C:\\temp\\fulltext\\index");
    StoreSearcher searcher = new StoreSearcher(storeDir);
    String str = "大?藏 & 阿難"; //同時出現 "大?藏" 和 "阿難", ?代表任意字符
    searcher.queryBegin(str, true);
    while(true){
        StoreSearcherResult ssr = searcher.getNextQueryResult();
        if ( ssr == null ){
            break;
        }
        System.out.println("ID "+ssr.docId+":"+ssr.matchedCount);
    }
    searcher.queryEnd();
    searcher.close();

    運行結果
    ID T01n0001.TXT:320
    ID T01n0002.TXT:3
    ID T01n0004.TXT:2
    ID T01n0005.TXT:202
    ID T01n0006.TXT:131
    ....



    附:全文檢索表達式舉例

    關鍵字中間可以出現?,表明匹配任意字符。

    運算符名稱:運算符字符
    AND:&
    OR:,
    BEFORE:*
    NEAR:+
    NOT:-

    表達式舉例:
    (KEY1 <AND|OR|BEFORE|NEAR> KEY2) & (NOT KEY3)
    KEY1 KEY2 (關鍵字之間無運算符假設為AND)



    附:全文檢索文件格式信息

    DocInfoStore(文檔信息)
    --HEAD--
    DocCount:Integer                    文檔數目
    --DOC HEAD(PER DOC)--
    DocSeq:    Integer                        文檔順序號,內部使用
    DocId:     Char[128]                    文檔唯一ID,字符串格式
    DocSepOfs: Integer                文檔分隔符數組的Ofs
    --DOC SEP OFS(PER DOC)--
    DocOfs:    ArrayOfInteger        文檔分隔數組


    WordInfoStore(每個漢字信息)
    --HEAD--
    WordCount:Integer                    漢字數
    --WORD IDX(Per Word)--
    WordChar:Integer                    漢字的Unicode值
    WordInfoOfs:Integer                漢字信息在文件中的偏移量
    WordInfoSize:Integer            漢字信息大小
    --WORD INFO(Per Word)--
    DocCount:                                    漢字出現的文檔數
    DocSeq(Per Doc):                  每個文檔的順序號
    WordInDocs:ArrayOfInteger 每個文檔中出現的漢字的偏移數組,從小到大排列


    源文件及CLASS下載地址:
    http://m.tkk7.com/Files/zhugf000/foreader2_ftsearch.zip

    Feedback

    # re: 中文全文檢索的實現以及一些經驗(Java)  回復  更多評論   

    2007-07-31 08:52 by BruceLuo
    看一下。。。。。。

    # re: 中文全文檢索的實現以及一些經驗(Java)  回復  更多評論   

    2007-07-31 10:33 by princegsc
    用正則表達式啊

    # re: 中文全文檢索的實現以及一些經驗(Java)[未登錄]  回復  更多評論   

    2007-07-31 10:59 by 劉明
    說起來,Lucene的性能似乎不行啊(我沒測試過啊,只是網上資料說明)。似乎千萬級別就比較慢了。前段日子用Lucene開發了個站內搜索(數據量大概在幾百萬吧),感覺無論是搜索(其實還好,在可接收范圍內)和索引都有點慢。有沒更好的實現啊?那些真正的能承受較大壓力的搜索都是怎么開發的?誰知道?

    # re: 中文全文檢索的實現以及一些經驗(Java)  回復  更多評論   

    2007-07-31 14:59 by BruceLuo
    都是的分布式的,索引和爬取基本上都是用的C++,WEB層用的是PHP,這是完美的結合!

    # re: 中文全文檢索的實現以及一些經驗(Java)  回復  更多評論   

    2007-07-31 17:08 by sitinspring
    這個有技術含量.

    # re: 中文全文檢索的實現以及一些經驗(Java)[未登錄]  回復  更多評論   

    2007-08-01 14:12 by 劉明
    笨笨啊,我有點迷茫。能給解答一下嗎?

    公司的站內搜索OK了,但領導讓我繼續研究研究搜索,但我不知道該繼續去研究什么好了。
    中文分詞?目前使用的模塊(JE)還可以,如果自己研發需要不少時間,還有詞庫問題。
    爬蟲?我們是站內搜索,雖然頭說站外也是個方向,但很不明確,我對沒有明確需求的東西實在不感興趣。
    分布式?目前的量還沒必要(幾百萬),差的很遠的,而且如果一直站內搜索的話也很難用上。
    緩沖?這個很有用,但目前實在沒有太好的想法。

    目前站內搜索的狀況就是正常運行,沒什么錯誤,也不知道該改些什么。很迷茫。(還有個項目相反,能正常運行,但我還有很多想法,但領導說我在那個項目浪費太多時間了,不許我再做了,能運行就行。-_-!)

    最近很怪,我對搜索的研究很迷茫,對用戶的需求倒是很感興趣。我一直在思考自己的東西最終能給用戶帶來什么,如何讓用戶更加方便的使用。

    嗯。。。就是很迷茫,有啥好的建議嗎?

    # re: 中文全文檢索的實現以及一些經驗(Java)  回復  更多評論   

    2007-08-02 14:04 by active1001
    用lucene檢索的時候,結果少的原因,應該是,你查詢的時候用的分詞器不對。
    在查詢之前先把每個字直接加一個空格。例如:“中文檢索”-》“中 文 檢 索”。

    # re: 中文全文檢索的實現以及一些經驗(Java)  回復  更多評論   

    2008-06-18 15:40 by litao
    很好的東西啊 呵呵 可惜缺少些jar

    能不能送我啊 litao1258@126.com

    多謝

    # re: 中文全文檢索的實現以及一些經驗(Java)  回復  更多評論   

    2008-07-01 15:12 by litao
    東西已經收到,不勝感激!

    # re: 中文全文檢索的實現以及一些經驗(Java)  回復  更多評論   

    2008-08-11 11:46 by 小雨轉晴
    你好,笨笨,我剛剛研究lucene,現在面臨的問題也是中文的全文檢索,
    我的問題正好和你相反,我返回的數據太多了。
    比如搜索的keyword是[高考]會被拆分為[高][考]兩個字進行檢索。
    這樣的話檢索大量數據的時候就會很慢,而且我做了關鍵字的高亮顯示
    這樣一來,比如標題為【2008年北京考區高考狀元】那么被高亮后為
    2008年北京[考]區[高][考]狀元,這樣看起來很不好,怎么樣可以按著【詞】來
    建立索引呢,然后按著【詞】進行檢索并高亮,頭疼的問題,可以和您討論一下嘛?
    其他的朋友也歡迎討論。希望您能聯系我一下,QQ396615834 MSN wind_1121@hotmail.com 十分感謝。
    主站蜘蛛池模板: 国产高潮久久免费观看| 亚洲欧洲免费视频| 亚洲国产成人片在线观看| 麻豆高清免费国产一区| 亚洲精品色在线网站| 亚洲乱码中文字幕综合| 日韩国产免费一区二区三区| 免费一级毛片在线播放视频免费观看永久| 亚洲国产精品无码AAA片| 成人最新午夜免费视频| 国产性生大片免费观看性 | 精品亚洲成a人片在线观看少妇| 成人在线免费观看| 最近2019中文免费字幕在线观看| 亚洲熟妇AV一区二区三区浪潮| 亚洲一区二区三区自拍公司| 在线观看人成视频免费| 最近新韩国日本免费观看| 免费一级全黄少妇性色生活片 | 成人爽a毛片免费| 在线观看亚洲视频| 亚洲精品一卡2卡3卡三卡四卡| 亚洲不卡无码av中文字幕| 无码一区二区三区AV免费| 99久久免费国产精精品| 亚洲暴爽av人人爽日日碰| 久久亚洲AV无码精品色午夜 | 免费h成人黄漫画嘿咻破解版| 精品无码免费专区毛片| GOGOGO免费观看国语| 亚洲av无码偷拍在线观看| 亚洲二区在线视频| 久久亚洲AV成人无码国产| 国产亚洲精品高清在线| 国产成人一区二区三区免费视频| 99re在线这里只有精品免费| 国产又黄又爽胸又大免费视频| 国产亚洲精品第一综合| 亚洲精品中文字幕无码A片老| 亚洲成a人片77777群色| 亚洲人成依人成综合网|