MySQL全文檢索

配置前準備html

MySQL > 6.*版本mysql

1、準備數據表
    mysql 複製表結構及信息到另外一張表的sql
    一、複製表結構及數據到新表
        CREATE TABLE 新表 SELECT * FROM 舊錶;
        
    二、只複製表結構到新表
        CREATE TABLE 新表 SELECT * FROM 舊錶 WHERE 1=2;(即:讓WHERE條件不成立.)
        CREATE TABLE 新表 LIKE 舊錶 ;(mysql4.0.25 不支持,mysql5已經支持了)
        
    三、複製舊錶的數據到新表(假設兩個表結構同樣)
        INSERT INTO 新表 SELECT * FROM 舊錶 ;
        
    四、複製舊錶的數據到新表(假設兩個表結構不同)
        INSERT INTO 新表(字段1,字段2,…….) SELECT 字段1,字段2,…… FROM 舊錶;sql

    五、複製舊錶附加條件的信息
        INSERT INTO 目標表 (字段1, 字段2, ...) 
        SELECT 字段1, 字段2, ...  FROM 來源表  
            WHERE not exists (select * from 目標表  
            where 目標表.比較字段 = 來源表.比較字段);數據庫

2、全文檢索
    一、MySQL全文檢索是利用查詢關鍵字和查詢列內容之間的相關度進行檢索,能夠利用全文索引來提升
        匹配的速度。
    
    二、配置條件: TABLE 須要是 MyISAM 類型的表;
        col一、col2 必須是char、varchar或text類型;
        col一、col2 上分別創建全文索引(FULLTEXT索引);
        MySQL 配置my.ini [mysql] 下添加 ft_min_word_len = 1 
        -- (默認4,經過 SHOW VARIABLES LIKE 'ft_min_word_len' 可查看);
    
    三、使用語法  
        SELECT * FROM tab_name WHERE MATCH ('列名1,列名2...列名n') AGAINST('詞1 詞2 詞3 ... 詞m');
        即:MATCH 至關於要匹配的列,而 AGAINST 就是要找的內容。
        
    四、檢索方式
        a、天然語言檢索: IN NATURAL LANGUAGE MODE
        b、布爾檢索: IN BOOLEAN MODE (經常使用)
            特點: 
              ·不剔除50%以上符合的row。 
              ·不自動以相關性反向排序。 
              ·能夠對沒有FULLTEXT index的字段進行搜尋,但會很是慢。 
              ·限制最長與最短的字符串。 
              ·套用Stopwords。
            語法規則:
                 +   必定要有(不含有該關鍵詞的數據條均被忽略)。 
                 -   不能夠有(排除指定關鍵詞,含有該關鍵詞的均被忽略)。 
                 >   提升該條匹配數據的權重值。 
                 <   下降該條匹配數據的權重值。
                 ~   將其相關性由正轉負,表示擁有該字會下降相關性(但不像 - 將之排除),只是排在較後面
                       權重值下降。 
                 *   萬用字,不像其餘語法放在前面,這個要接在字符串後面。 
                 " " 用雙引號將一段句子包起來表示要徹底相符,不可拆字。
            例如:
                @ SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('+apple -banana' IN BOOLEAN MODE);
                注:+ 表示AND,即必須包含。- 表示NOT,即必須不包含。即:返回記錄必需包含 apple,且不能包含 banner。
                
                @ SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('apple banana' IN BOOLEAN MODE);
                注:apple和banana之間是空格,空格表示OR。即:返回記錄至少包含apple、banana中的一個。
                
                @ SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('+apple banana' IN BOOLEAN MODE);
                注:返回記錄必須包含apple,同時banana可包含也可不包含,若包含的話會得到更高的權重
                
                @ SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('+apple ~banana' IN BOOLEAN MODE);
                 注:~ 是咱們熟悉的異或運算符。返回記錄必須包含apple,若也包含了banana會下降權重。
                    可是它沒有 +apple -banana 嚴格,由於後者若是包含banana壓根就不返回。
                    
                @ SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('+apple +(>banana <orange)' IN BOOLEAN MODE);
                 注:返回必須同時包含「apple banana」或者必須同時包含「apple orange」的記錄。
                    若同時包含「apple banana」和「apple orange」的記錄,則「apple banana」的權重高於「apple orange」的權重。
                    
        c、查詢擴展檢索: WITH QUERY EXPANSION
        
3、注意事項:
    一、預設搜尋是不分大小寫,若要分大小寫,columne 的 character set要從utf8改爲utf8_bin。
    二、預設 MATCH...AGAINST 是以相關性排序,由高到低。
    三、MATCH(title, content)裏的字段必須和FULLTEXT(title, content)裏的字段如出一轍。
        若是隻要單查title或content一個字段,那得另外再建一個 FULLTEXT(title) 或 FULLTEXT(content),也由於如此,MATCH()
        的字段不能跨table。
    四、MySQL不支持中文全文索引,緣由很簡單:與英文不一樣,中文的文字是連着一塊兒寫的,中間沒有MySQL能找到分詞的地方;
        若是你的MySQL是安裝在Windows平臺上的,能夠不用轉碼直接存儲中文就可使用全文索引。
        可是若是你的MySQL是安裝在Linux上的則須要進行轉編碼(urlencode / base64_encode / json_encode / 區位 / 拼音)等進行
        編碼使之以「字母+數字」 的方式存儲於數據庫中。
    五、InnoDB 在 MySQL5.6 以後新引入了引擎對FULLTEXT索引的支持,以前只有MyISAM引擎支持FULLTEXT索引。
        ***** 也就是MySQL5.6以後的版本對數據表的類型不作要求了,均可以使用。json

文章參考:http://www.cnblogs.com/martinzhang/p/3220345.htmlapp

相關文章
相關標籤/搜索