MySQL(FullText)

fulltext变量:
  show variables like "%FT%"

  +---------------------------------+----------------+
  | ft_boolean_syntax               | + -><()~*:""&| |
  | ft_max_word_len                 | 84             |
  | ft_min_word_len                 | 4              |
  | ft_query_expansion_limit        | 20             |
  | ft_stopword_file                | (built-in)     |
  | innodb_ft_aux_table             |                |
  | innodb_ft_cache_size            | 8000000        |
  | innodb_ft_enable_diag_print     | OFF            |
  | innodb_ft_enable_stopword       | ON             |
  | innodb_ft_max_token_size        | 84             |
  | innodb_ft_min_token_size        | 3              |
  | innodb_ft_num_word_optimize     | 2000           |
  | innodb_ft_result_cache_limit    | 2000000000     |
  | innodb_ft_server_stopword_table |                |
  | innodb_ft_sort_pll_degree       | 2              |
  | innodb_ft_total_cache_size      | 640000000      |
  | innodb_ft_user_stopword_table   |                |
  +---------------------------------+----------------+

(MySQL5.7.6开始支持中日韩的分词器ngram parser)
  show variables like "%ngram%";

  +------------------+-------+
  | Variable_name    | Value |
  +------------------+-------+
  | ngram_token_size | 2     |
  +------------------+-------+

fulltext tables(INNODB information_schema):

INNODB_SYS_INDEXES:提供了InnoDB索引的状态信息
INNODB_SYS_TABLES:提供了InnoDB表的状态信息
INNODB_FT_CONFIG:显示一个InnoDB表的FULLTEXT索引及其相关处理的元数据
INNODB_FT_INDEX_TABLE:转化后的索引信息用于处理基于InnoDB表FULLTEXT索引的文本搜索。一般用于调试诊断目的
INNODB_FT_INDEX_CACHE:向含FULLTEXT索引的InnoDB表插入数据后新插入数据转后的索引信息
INNODB_FT_DEFAULT_STOPWORD:在InnoDB表上创建FULLTEXT索引所使用的默认停止字表
INNODB_FT_DELETED:记录了从InnoDB表FULLTEXT索引中删除的行
INNODB_FT_BEING_DELETED:用于记录正在被删除的信息,用于监控和调试目的

 

fulltext分词处理:
  默认的parser和限定的ngram parser
  默认的parser适合latin
  限定的ngram parser适合中日韩
  默认的parser使用nnodb_ft_min_token_size和innodb_ft_max_token_size决定词的大小
  限定的ngram parser的ngram_token_size, 决定词的大小, 它的合法的取值范围是1到10
  若用了ngram_token_size,所以innodb_ft_min_token_size和innodb_ft_max_token_size将不适用于n-gram
  对于一个新的词,默认的parser会查找stopwords表,看是否有匹配的词,如果匹配,这个词就不会加入到全文索引中
  对于一个新的词,限定的ngram parser会查找stopwords表,看是否包含里面的词,如果包含,就不会把原词加入到全文索引中
 如果mysql内置的分词器效果不理想,可以使用第三方插件或者自己分完词后存储和索引

 

fulltext查询处理:
  文本查询,在自然语言模式(NATURAL LANGUAGE MODE)下,文本的查询被转换为n-gram分词查询的并集
  文本查询,在布尔模式(BOOLEAN MODE),文本查询被转化为n-gram分词的短语查询
  通配符查询,如果前缀的长度比ngram_token_size小,那么查询结果将返回在全文索引中所有以这个词作为前缀的n-gram的词
  通配符查询,如果前缀的长度大于等于ngam_token_size,那么这个查询则转换为一个短语(phrase search),通配符则被忽略
  短语查询,被转换为n-gram分词的短语查询
  一般来说,查询正好等于ngram_token_size的词,速度会更快,但是查询比它更长的词或短语,则会变慢

fulltext搜索语法:
  MATCH (col1,col2,…) AGAINST (expr[search_modifier])
  col1,col2,…为已建立FULLTEXT索引并要从中查找数据的列
  expr为要查找的文本内容
  search_modifier的每个取值代表一种类型的全文搜索
  search_modifier取值:
    IN NATURAL LANGUAGE MODE:自然语言全文搜索(默认)
    IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION:带查询扩展的自然语言全文搜索
    IN BOOLEAN MODE:布尔全文搜索
    WITH QUERY EXPANSION:查询扩展全文搜索

 

fulltext例子:
    (建立索引)
    use xxxxx;
    alter table company add fulltext ( `co_name`);

    (索引查询)
    select co_id,co_name from company where match (`co_name`) against ('最淘科技') limit 10;
    select count(*) from company where match (`co_name`) against ('科技');
    select count(*) from company where match (`co_name`) against ('科技*');
    select count(*) from company where match (`co_name`) against ('*科技');
    select count(*) from company where match (`co_name`) against ('*科技*');

    (全表扫描)
    select count(if(match (`co_name`) against ('最淘科技'))) as count from company;

 

fulltext搜索模式:
  1.自然语言模式NATURAL LANGUAGE MODE。
    MySQL全文搜索的默认搜索方式. 把搜索字符串解释为一系列单词并查找包含这些单词的数据行。

  2.布尔全文搜索BOOLEAN MODE
    把搜索字符串解释为一系列单词,但允许使用一些操作符字符来"修饰"这些单词以表明特定的要求,如某给定单词必须出现(或不出现)在匹配数据行里,某个数据行必须包含一个精确的短语,等等。

   “+”表明结果中必须包含
    “-”表明所得结果中不能含有
    空字符表明后跟的单词是可选的,但出现的话会增加该行的相关性
    “@distance”用于指定两个或多个单词相互之间的距离(以单词度量)需在指定的范围内
    “>”用于增加后跟单词对其所在行的相关性的贡献
    “<”用于降低该贡献
    “()”用于将单词分组为子表达式且可以嵌套
    “~”是后跟单词对其所在行的相关性的贡献值为负
    “*”为普通的通配符,若为单词指定了通配符,那么即使该单词过短或者出现在了停止字列表中它也不会被移除
    “””,括在双引号中的短语指明行必须在字面上包含指定的短语,全文搜索将短语分割为词后在FULLTEXT索引中搜索
    非字字符无需完全匹配

  3.查询扩展全文搜索WITH QUERY EXPANSION
    这种搜索分两阶段进行。第一阶段是自然语言搜索,第二阶段使用原来的搜索字符串加上在第一次搜索中找到的相关度最高的匹配数据行再进行一次搜索。
    这扩大了搜索范围,它可以把与原来的搜索字符串相关、但用原来的搜索字符串匹配不到的数据行也找出来

 

fulltext索引提示限定:
  1.对于自然语言模式的全文搜索,索引提示会被忽略而不给出任何提示,比如虽明确在查询语句中给出了IGNORE INDEX(i)指明不使用i索引,但是该索引提示会被忽略掉,最终的查询中仍会使用索引i
  2.对于布尔模式的全文搜索,FOR ORDER BY和FOR GROUP BY的索引提示会被忽略,FOR JOIN和不带FOR修饰符的索引提示不被忽略

 

fulltext vs like
  LIKE搜索的耗时随着记录数的增加而线性增长,但对于10万行记录以下的表搜索时间基本上能保持在1秒以内
  FULLTEXT搜索耗时也随表中记录数的增长而线性增加。对于10万行记录以下的表搜索时间基本上能保持在0.01秒以内
  无论是LIKE搜索还是FULLTEXT搜索,其性能都会随着记录数的增长而下降,项目中的文本搜索数据库记录数庞大到一定规模后,需要考虑其他文本搜索解决方案

 

fulltext Note:
  目前可对MyISAM表和InnoDB表的CHAR、VARCHAR、TEXT类型的列创建全文索引
  分区表不支持全文搜索
  表意型语言如汉语、日语没有诸如空格之类的单词定界符。因此FULLTEXT解析器不能确定此类语言中词的起止。对于此种情况要特殊处理(比如将中文转换成一种单字节类似英文习惯的存储方式)
  全文索引同其他索引一样,可在创建表是由CREATE TABLE语句创建也可以在表创建之后用ALTER TABLE或者CREATE INDEX命令创建
  对于要导入大量数据的表先导入数据再创建FULLTEXT索引比先创建索引后导入数据会更快
  默认情况下全文搜索大小写不敏感
  FULLTEXT解析器自动移除首尾的“’”
  FULLTEXT解析器用“ ”(空格)、“,”(逗号)“.”(点号)作为默认的单词分隔符,因此对于不使用这些分隔符的语言如汉语来说FULLTEXT解析器不能正确的识别单词,对于这种情况需做额外处理
  FULLTEXT索引可以为一个或多个数据列而创建。如果它涉及多个数据列,基于该索引的搜索将在所有数据列上同时进行。
  全文搜索时,MATCH()函数给出的数据列清单必须和某个FULLTEXT索引所匹配的那些数据列精确匹配
  全文搜索对"单词"的定义是:由字母、数字、撇号(如"it's"中的"'")和下划线字符构成的字符序列
  全文搜索匹配整个单词,而不是单词的一部分
  只要在一个数据行里找到了搜索字符串里的任何单词,FULLTEXT引擎就会认为这个数据行与搜索字符串是匹配的
  全文搜索将忽略stopword列表中的单词, stopword列表包含诸如“the”、“or”、“and”等常用单词,这些词通常被认为没有什么语义价值
  全文搜索还将忽略一些常用单词,如"the"、"after"和"other"等,这些单词被称为"休止单词",MySQL在进行全文搜索时总是会忽略它们
  全文搜索还将忽略太短的单词。在默认的情况下,"太短"指少于4个字符, 但可以通过重新配置服务器的办法把这个最小长度设置为其他值
  文本集合和查询语句中的单词的权重由该单词在集合或语句中的重要性确定。单词在越多的行中出现则该单词的权重越低,反之权重越高
  全文搜索返回的行是按与所查找内容的相关度由高到低的顺序排列的。
  全文搜索查询内容与结果相关度的值由WHERE语句中的MATCH (…) AGAINST (…)计算所得,是一个非负浮点数。
  全文搜索查询内容与结果相关度的值越大表明相应的行与所查找的内容越相关,0值表明不相关。
  全文搜索查询内容与结果相关度的值基于行中的单词数、行中不重复的单词数、文本集合中总单词数以及含特定单词的行数计算得出
  多数全文搜索相关的变量不能在Server运行的时候修改。需在Server启动时指定这些参数,或者修改完参数之后重新启动Server
  某些变量修改后需要重建FULLTEXT索引
  InnoDB表重建FULLTEXT索引可以通过带DROP INDEX和ADD INDEX从句的ALTER TABLE语句完成,先删除旧的再创建新的
  MyISAM表重建FULLTEXT索引可以通过带DROP INDEX和ADD INDEX从句的ALTER TABLE语句完成,先删除旧的再创建新的,也可以通过QUICK repair操作来重建

 

helper:
  同表复制
    UPDATE 表名S SET b列名=源a列名
    UPDATE 表名S SET b列名=CONCAT(b列名,",",a列名)
    UPDATE 表名S SET b列名=源A列名 WHERE XXX
    UPDATE 表名S SET b列名=CONCAT(b列名,",",a列名) WHERE XXX
  异表复制
    update T set b列名 = S.源A列名 from S join T on (A.id = T.id);
    update T set T.b列名 = (select S.源A列名 from S where S.id = T.id)

转载于:https://my.oschina.net/igooglezm/blog/882936

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值