MySQL全文检索

配置前准备

MySQL > 6.*版本

一、准备数据表
    mysql 复制表结构及信息到另一张表的sql
    1、复制表结构及数据到新表
        CREATE TABLE 新表 SELECT * FROM 旧表;
        
    2、只复制表结构到新表
        CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2;(即:让WHERE条件不成立.)
        CREATE TABLE 新表 LIKE 旧表 ;(mysql4.0.25 不支持,mysql5已经支持了)
        
    3、复制旧表的数据到新表(假设两个表结构一样)
        INSERT INTO 新表 SELECT * FROM 旧表 ;
        
    4、复制旧表的数据到新表(假设两个表结构不一样)
        INSERT INTO 新表(字段1,字段2,…….) SELECT 字段1,字段2,…… FROM 旧表;

    5、复制旧表附加条件的信息
        INSERT INTO 目标表 (字段1, 字段2, ...) 
        SELECT 字段1, 字段2, ...  FROM 来源表  
            WHERE not exists (select * from 目标表  
            where 目标表.比较字段 = 来源表.比较字段);

二、全文检索
    1、MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高
        匹配的速度。
    
    2、配置条件: TABLE 需要是 MyISAM 类型的表;
        col1、col2 必须是char、varchar或text类型;
        col1、col2 上分别建立全文索引(FULLTEXT索引);
        MySQL 配置my.ini [mysql] 下添加 ft_min_word_len = 1 
        -- (默认4,通过 SHOW VARIABLES LIKE 'ft_min_word_len' 可查看);
    
    3、使用语法  
        SELECT * FROM tab_name WHERE MATCH ('列名1,列名2...列名n') AGAINST('词1 词2 词3 ... 词m');
        即:MATCH 相当于要匹配的列,而 AGAINST 就是要找的内容。
        
    4、检索方式
        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
        
三、注意事项:
    1、预设搜寻是不分大小写,若要分大小写,columne 的 character set要从utf8改成utf8_bin。
    2、预设 MATCH...AGAINST 是以相关性排序,由高到低。
    3、MATCH(title, content)里的字段必须和FULLTEXT(title, content)里的字段一模一样。
        如果只要单查title或content一个字段,那得另外再建一个 FULLTEXT(title) 或 FULLTEXT(content),也因为如此,MATCH()
        的字段不能跨table。
    4、MySQL不支持中文全文索引,原因很简单:与英文不同,中文的文字是连着一起写的,中间没有MySQL能找到分词的地方;
        如果你的MySQL是安装在Windows平台上的,可以不用转码直接存储中文就可以使用全文索引。
        但是如果你的MySQL是安装在Linux上的则需要进行转编码(urlencode / base64_encode / json_encode / 区位 / 拼音)等进行
        编码使之以“字母+数字” 的方式存储于数据库中。
    5、InnoDB 在 MySQL5.6 之后新引入了引擎对FULLTEXT索引的支持,之前只有MyISAM引擎支持FULLTEXT索引。
        ***** 也就是MySQL5.6之后的版本对数据表的类型不做要求了,都可以使用。

文章参考:http://www.cnblogs.com/martinzhang/p/3220345.html

猜你喜欢

转载自my.oschina.net/u/1168056/blog/1789709
今日推荐