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

相关文章
相关标签/搜索