• mysql全文索引


    引用:https://www.cnblogs.com/miracle-luna/p/11147859.html

    MySQL 5.7.6之前只支持英文全文索引,不支持中文全文索引,,需要利用分词器把中文段落预处理 拆分成单词,,然后存入数据库
    MySQL 5.7.6 开始,,内置了 ngram全文解析器,,用来支持中文

    ngram全文解析器

    ngram一段文字里面连续的n个字的序列
    ngram全文解析器能够对文本进行分词,,每个单词是连续的n 个字的序列
    例如: 用ngram全文解析器对 “恭喜发财” 进行分词:

    n=1: '恭', '喜', '发', '财' 
    n=2: '恭喜', '喜发', '发财' 
    n=3: '恭喜发', '喜发财' 
    n=4: '恭喜发财'
    
    • 1
    • 2
    • 3
    • 4

    全局变量ngram_token_size : 分词大小,默认2

    show variables like 'ngram_token_size'
    
    • 1

    可以修改mysql配置文件my.ini,在末尾增加一行 ngram_token_size=2

    重启mysql服务:

    net stop mysql
    net start mysql
    
    • 1
    • 2

    重启之后刷新表的索引:

    repair table 表名 quick
    
    • 1

    创建全文索引:

    创建表的时候创建中文的全文索引

    create table hehe1 (
        id int not null ,
        note_text text null,
        primary key (id)
        # 使用ngram中文解析器
        fulltext (note_text) with parser ngram
    ) character set utf8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    或者使用命令创建全文索引:

    alter table 表名 add fulltext index 索引名(要索引的那个字段) with parser ngram
    alter table hehe1 add fulltext index hehehe(note_text) with parser ngram
    
    • 1
    • 2
    使用全文检索

    match() : 指定被搜索的列
    navigat(): 要使用的搜索表达式

    select * from hehe1 where match(note_text) against('我爱学习' in natural language mode )
    select *, match(note_text) against('学习 傻逼' in boolean mode ) as score from hehe1 where match(note_text) against('学习 傻逼' in boolean mode )
    
    • 1
    • 2
    全文检索模式
    1. 自然语言模式 natural language mode
      是mysql的默认全文检索模式,,
      自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现 等 复杂查询

    2. 布尔模式 boolean mode
      可以使用操作符,,可以支持指定关键词必须出现,,或者必须不能出现,,权重高还是低等 复杂查询

      • 要匹配的词
      • 要排斥的词: 某行包含这个词,则不返回该行,即使它包含其他指定词也是如此
      • 排列提示 : 值某些词比其他词 更重要,,更重要的词等级更高
      • 表达式分组???、

    布尔方式,即使没有定义fulltext索引,,也可以使用它,,但这是一种非常缓慢的操作(其性能随着数据量的增加而降低)
    在这里插入图片描述

    'apple banana' 
    无操作符,表示或,要么包含apple,要么包含banana
    
    '+apple +juice'
    必须同时包含两个词
    
    '+apple macintosh'
    必须包含apple,但是如果也包含macintosh的话,相关性会更高。
    
    '+apple -macintosh'
    必须包含apple,同时不能包含macintosh。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 查询扩展
      在使用查询扩展时,mysql对数据和索引,,进行两遍扫描来完成搜索:
      • 首先进行一个基本的全文搜索,找出与搜索条件匹配的所有行
      • 其次,mysql检查这些匹配行,,并选择所有有用的词,(mysql如何判定什么有用,什么无用???)
      • 最后,mysql进行全文本搜索,,不仅使用原来的条件,,而且还是用所有有用的词
    # 会输出更多的查询项  with query expansion
    select * from hehe1 where match(note_text) against('学习' with query expansion )
    
    • 1
    • 2
    注意
    1. 在索引全文本数据时,短词被忽略且从索引中排除,,设置分词长度
    2. mysql带有一个内建的非用词stopword列表,,这些词在索引全文本数据时,,总是被忽略,如果需要,,可以覆盖这个列表
    3. 如果到导入大数据集,,先导入数据,再在表上创建全文索引,,,定义fulltext索引之后,mysql会自动维护该索引,,在,增加,,更新,,或者删除 行的时候,索引随之更新,,,所以不要在导入数据时使用 fulltext,,更新索引要花时间

    问题:

    #修改表字段的字符集
    alter table productnotes modify note_text text character set utf8
    #查看mysql版本
    select version()
    
    • 1
    • 2
    • 3
    • 4

    全文检索fulltext搜索不到内容:
    查看全文检索配置:

    # 查看英文搜索最小单词:`ft_min_word_len`
    show variable like 'ft%'
    
    • 1
    • 2

    ft_min_word_len改为1,,,在mysql配置文件中修改,并重启

    # 快速重建表格  repair只适用于MyISAM
    repair table article quick;
    
    • 1
    • 2

    引用:https://www.zhangbj.com/p/64.html


    like 和 regexp 虽然这些搜索机制非常有用,但存在几个重要的限制:

    • 性能 — 通配符和正则表达式匹配通常要求mysql尝试匹配表中的所有行,,这些搜索极少使用表索引,,,由于搜索行数不断增加,,这些搜索可能非常耗时
  • 相关阅读:
    《崩坏:星穹铁道》1.5仙舟罗浮-绥园全宝箱攻略
    java——事务
    一个普通双非女生的秋招之路
    关于排序中最少交换次数的证明(置换环)
    百度AI智能审核
    云计算 | 中国信通院《2022 云计算白皮书》阅读、理解与总结
    Kafka 线上性能调优
    JAVA春运出行铁路路线规划推荐系统计算机毕业设计Mybatis+系统+数据库+调试部署
    Linux网络接口配置文件ifcfg-eth0说明
    SpringMVC之综合案例
  • 原文地址:https://blog.csdn.net/qq_36022463/article/details/128005741