【mysql】字符集、字符序、分词查询

前言:

    以下内容 毫不客气滴说:均来自网络再见 上面的三个词混着在正文中

正文:

Mysql5.6分词查询:和5.7稍微有些差别

详情见:https://www.cnblogs.com/ibook360/p/5073313.html(其中例子执行的结果和文中不一样)

查询关键字和查询列内容见相关度进行检索,可利用全文索引提高匹配速度

    MATCH(col*) AGAINST(expr[search_modifier])要匹配的列,要找的内容,以相关性排序、由高到低

前提

    在MySQL5.6及其以下,只有MyISAM表支持全文检索(英文)。

    在MySQL5.6以上Innodb引擎表也提供支持全文检索。

      相应字段建立FULLTEXT索引

CREATE TABLE `zzx_articles` (
`id` int(10) unsigned NOT NULL auto_increment, 
`title` char(254) default NULL COMMENT '标题',
`content` text COMMENT '内容',
`author` char(60) default NULL COMMENT '作者',
`title_fc` char(254) default NULL COMMENT '标题的分词',
`content_fc` text COMMENT '内容的分词',
PRIMARY KEY  (`id`),
FULLTEXT KEY `zzx_title_fc` (`title_fc`),//看这里
FULLTEXT KEY `zzx_content_fc` (`content_fc`),//看这里
FULLTEXT KEY `zzx_title_con_fc` (`title_fc`,`content_fc`)//看这里
) ENGINE=MyISAM DEFAULT CHARSET=utf8

    MATCH(title, content)里的字段必须和FULLTEXT(title, content)里的字段一模一样

    如果只要单查title或content一个字段,那得另外再建一个 FULLTEXT(title) 或 FULLTEXT(content)

检索方式:

1、自然语言检索: IN NATURAL LANGUAGE MODE

2、布尔检索:IN BOOLEAN MODE

    剔除一半匹配行以上都有的词,表中每行的待查字段都有this、用this去查不会有结果(中断词、都查出来?)

特色:

    1、不自动以相关性反向排序;

    2、可对没有fulltext index字段搜寻(慢);

    3、限制最长短字符串;

    4、套用stopwords

规则:

    +:一定要有该关键字;

    2、-:不可以有; 

    3、>:提高该条匹配数据的权重值; 

    4、<:降低;

    5、~:将其相关性由正转负,拥有该字会降低相关性;

    6、*:万用字,接在字符串后;

    7、””:用双引号包起来,要完全相符,不可拆

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”的权重。

这个我执行的例子+ - 并没有完全起作用

3、查询扩展检索:with query expansion

拿大神博客中的例子上一张图:select中定义了三个别名,作为排序的依据,这个和where配合使用、可不配合(具体要听需求的)

 

系统变量:

    ft_min_word_len=全文检索的最小许可字符(默认4)

     SHOW VARIABLES LIKE 'ft_min_word_len' 中文两个字一个词,做中文检索修改为2

 方法:

    修改配置文件my.ini,添加:ft_min_word_len = 2


不支持中文全文索引:中文连着写,mysql无法找到分词(5.6)

如果一定要查:

    整句的中文分词,按urlencode、区位码、base64、拼音进行编码,字母+数字的方式存储于库中

不支持大小写:

    若要分,columne的character set 要从utf8改成utf8_bin

mysql5.7:和mysql5.6几乎是差不多的

    MySQL内置了ngram全文检索插件,用来支持中文分词,并且对MyISAM和InnoDB引擎有效


    InsideMySQL大神曾说:mysql自带全文索引的性能与solr在同一个数量级,并没有特别明显的差距,自行测试、本宝就不验证了;这个具体看博客吧,挺详细的,和5.6页差不多

    https://blog.csdn.net/mysqldba23/article/details/70160862

    https://www.jb51.net/article/100472.htm

    https://blog.csdn.net/shuishui8310/article/details/49889735



字符集和字符序:

 字符集:字符及字符对应的编码的集合;转换表和编码方案的组合

  支持层次:服务器(server),数据库(database),数据表(table)和连接(connection)

 

存取数据时,没有指定字符集和规则则向前追溯,安装程序时自动在配置文件中配置default-character-set=utf8,utf8_general_ci默认collation

    Utf8目前最适合于实现多种不同字符集间的转换的字符集

    如中文字符集gb2312包括简体中文所有规定汉子及对应代码

    每种字符集有其对应的规则


Collation字符序:

  比较字符的规则的集合,确定后才能在一个字符集上定义什么是等价的字符、及字符间的大小关系,latin1<gb2312<gbk<utf8(定要:connection字符集>=client字符集)

   有了规则可将数据排序,对同一组字符集可有不同排序标准

不同字符集传递到mysql:

    存储时客户端将字符以ASCII或UNICODE方式发给服务器,服务器把字符传递给mysql,mysql针对当前连接的设置转换字符,存储

读取,mysql从表中取出数据,更加当前连接,转换下编码发送给客户端,安装ASCII或UNICODE显示

查看命名:

支持的字符集:

    1、show character set;

    2、select * from information_schema.character_sets;

    3、select character_set_name,default_collate_name,description,maxlen from information_schema.character_sets;


https://blog.csdn.net/qq_41880379/article/details/79650322

https://www.2cto.com/database/201703/618235.html

http://imysql.cn/charset_tips

https://www.cnblogs.com/wcwen1990/p/6917109.html

 

 学习总结——看见没~一个个小胶印



猜你喜欢

转载自blog.csdn.net/ma15732625261/article/details/80680423