全文索引,創建全文索引?

大家好,今天本篇文章就來給大家分享全文索引,以及創建全文索引對應的知識和見解,內容偏長哪個,大家要耐心看完哦,希望對各位有所幫助,不要忘了收藏本站喔 。
1全文索引的原理原理是先定義一個詞庫,然后在文章中查找每個詞條(term)出現的頻率和位置,把這樣的頻率和位置信息按照詞庫的順序歸納,這樣就相當于對文件建立了一個以詞庫為目錄的索引,這樣查找某個詞的時候就能很快的定位到該詞出現的位置 。
問題在處理英文文檔的時候顯然這樣的方式是非常好的,因為英文自然的被空格分成若干詞,只要我們有足夠大的詞匯庫就能很好的處理 。但是亞洲文字因為沒有空格作為斷詞標志,所以就很難判斷一個詞,而且人們使用的詞匯在不斷的變化,而維護一個可擴展的詞匯庫的成本是很高的,所以問題出現了 。
解決出現這樣的問題使“分詞”成為全文索引的關鍵技術 。目前有兩種基本的 *** :
二元法 它把所有有可能的每兩兩漢字的組合看為一個詞組,這樣就沒有維護詞庫的開銷 。
詞庫法 它使使用詞庫中的詞作為切分的標準,這樣也出現了詞庫跟不上詞匯發展的問題,除非你維護詞庫 。
實際上現在很多著名的搜索引擎都使用了多種分詞的辦法,比如“正向更大匹配”+“逆向更大匹配”,基于統計學的新詞識別,自動維護詞庫等技術,但是顯然這樣的技術還沒有做到完美 。
2什么是全文索引 全文檢索技術全文檢索,是指直接以全文本信息作為主要處理對象,并根據數據資料的內容而不是外在特征來實現的信息檢索手段 。它的基本工作方式是能夠將所有包含檢索詞的文獻檢索出來,不管這個詞出現在文獻的什么位置,或者說文獻中的任意一個詞都可以作為檢索到該文獻的條件 。
全文檢索提供存取全文文本(指原始記錄)的空間,文本中任何字符和字符串均可作為檢索的入口點,全文檢索是以原始記錄中的檢索詞、字間的特定位置為對象的運算,對文獻不作標引,故沒有標引用詞 。因此,全文檢索是一種可以不依賴敘詞表而直接使用自由詞的檢索 ***。

全文索引,創建全文索引?

文章插圖
3MySQL的全文索引Fulltext Index | 包括ngram InnoDB的全文索引使用反向索引的設計 。反向索引存儲了一個單詞(word)列表,對于每個單詞,都有一個文檔的列表,來標識這個單詞出現的地方 。為了支持臨近搜索(proximity search),每個單詞的位置信息也以字節偏移的方式存儲 。
當創建了InnoDB全文索引,一系列的索引表會一同被創建,見下面的例子:
最前面的六個表包含了反向索引,它們被稱作附屬索引表(auxiliary index table) 。當輸入的表被索引(tokenized)后,每個獨立的單詞(亦稱作“tokens”)會被攜帶其DOC_ID和位置信息插入到索引表中 。根據單詞之一個字符的字符集排序權重,在六個索引表中對單詞進行完全排序和分區 。
反向索引分區到六個附屬索引表以支持并行的索引創建 。默認有2個線程復制索引(Tokenize)、排序、插入單詞和關聯數據到索引表中 。工作的線程的數量由innodb_ft_sort_pll_degree 配置項控制的 。對于大表的全文索引,可以考慮增加線程數量 。
如果主表創建在 xx表空間,索引表存儲在它們自己的表空間中 。反之,索引表存儲于其索引的表空間中 。
前面例子展示的另外一種索引表被稱作通用索引表,它們被用于全文索引的“刪除處理(deletion handing)”和存儲內部狀態 。不同于為每個全文索引都各自創建的反向索引表,這組表對特定表的所有全文索引都是共用的 。
即使全文索引刪掉了,通用索引(Common Index)也會被保留,當全文索引刪除后,為這個索引而創建的FTS_DOC_ID列依然保留,因為移除FTS_DOC_ID列會導致重構之前被索引的表 。管理FTS_DOC_ID列需要用到通用索引表 。
為了防止大量并發讀寫附屬表,InnoDB使用全文索引緩存去臨時緩存最近的插入行 。在存滿并刷入磁盤之前,緩存的內容一直存儲在內存之中,可以通過查詢 INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE 表去查看最近緩存的插入行 。
緩存和批處理刷新行為避免了對輔助索引表的頻繁更新,頻繁更新可能會在繁忙的插入和更新期間導致并發訪問問題 。批處理還避免了對同一個word的多次插入,更大化的減少了重復的條目 。相同的word會先merge再刷入到磁盤中,而不是為每個word單獨插入,這樣提高了插入效率并且使得索引附屬表盡可能的小 。

推薦閱讀