zoukankan      html  css  js  c++  java
  • MySQL 中文分词原理

    一,首先我们来了解一下其他几个知识点:
    1. Mysql的索引意义?
    索引是加快访问表内容的基本手段,尤其是在涉及多个表的关联查询里。当然,索引可以加快检索速度,但是它也同时降低了索引列的插入,删除和更新值的速度。

    换通俗的话来讲:

    mysql中的索引就是一个特殊的平衡二叉树,当在平衡二叉树中搜索某一条值的时候,上亿条的数据可以在十多次内可以塞选出来。
    所以,每个数据表里面有多少个索引就有多少个对应的索引表。
    当然,一个表里面的索引越多写入速度会越慢,但读去速度会越。
    mysql的索引类型:

    唯一索引。
    常规索引。
    fulltext索引
    spatial索引
    hash索引
    2. 什么fulltext索引?
    fulltext索引也叫做全文本索引,MySQL具备全文搜索的能力,它可以让你在不使用模板匹配操作的情况下进行单词或短语的查找。

    ps:(个人理解)
    1. mysql的全文本索引是针对与英文文本的索引(毕竟是别人国外人开发的mysql),我们知道在一篇英文文章中可以发现一个特点,每个单词与每个单词都是以空格隔开的。如果我们把每个单词看做一个数据,按照单词的大小来进行前后排列,也可以形成一个二叉树。
    2. 有规律可循,有二叉树,我们就可以对其快速搜索,并可以对应进行封装成索引,也就是我们所说的全文本索引————fulltext索引。

    3. 注意————fulltext索引只能搜索英文。
    二,使用FULLTEXT搜索
    1. 全文搜索的特性(重点)
    全文搜索基于fulltext索引。fulltext索引,只能出现在char varchar text这几种类型的表字段里面。

    全文搜索会忽略那些常见词:常见词,指的是至少一半的行里都出现过,超过50%的词,都为常见词;

    有些为内建的常用单词:也叫停用词,比如:the/after,other

    比较短的单词也会被停用。

    单词的定义:它们是由字母,数字,撇号和下划线,构造而成的字符串。(英文单词完全符合,但是中文不行)

    可以为一个字段(列)创建fulltext索引,也可以为多个字段(列)创建一个fulltext索引。

    注意:一个索引是一个平衡二叉树。

    1. 如果给a字段建立一个索引,当进行全文本搜索时候,只要命中a字段即可完成搜索。
    2. 如果为a和b两个字段同时建立一个fulltext索引时,它的平衡二叉树里面是包括这两个字段的所有数据。如果此刻,我们只想对a字段进行全文本搜索,这个fulltext是做不到的,只能另外在建立一个a字段的fulltext索引。
    2全文搜索分类
    自然语言搜索(默认类型):mysql会把搜索的字符串解析成一系列的单词,然后去搜索出包含这些单词的那些行;

    布尔模式搜索:可以为搜索的字符串里加修饰词,用于表明某些特定的要求,比如匹配行里必须出现某些单词,而且必须按照规定顺序出现,或者不能存在某些单词等。

    查询扩展搜索:这种搜索分为两个阶段。第一阶段,是自然语言搜素。第二阶段,则先把原来的搜索字符串,与第一阶段的搜索里高度匹配的那些行,连接到一起,在一次进行全文本搜索。

    3 mysql语法:
    建立索引语法:

    建表
    create table article (title varchar(40),contain text ) engine = myisam;
    建立三个索引
    alter table article
    add fulltext (title),
    add fulltext (contain),
    add fulltext (title, contain);
    4. 自然语言索引
    命中title这个fulltext索引,并搜索包含“hello”这个单词的所有行。

    select * from article where match(title) against("hello");
    命中title和contain两列的这个fulltext索引,并搜索包含“word”这个单词的所有行。

    select * from article where match(title, contain) against("word");
    输出match()这个mysql函数的返回值——搜索单词的权重。

    select title, match(title) against("word") as relevance from article ;
    注意:其实完整的自然语言搜索需要添加IN NATURAL LANGUAGE MODE,如下所示

    select * from article where match(title) against("hello" IN NATURAL LANGUAGE MODE);
    5. 布尔模式索引
    1. 特点
    50%一样的规则:不生效了
    查询结果不再按照相关程度排序
    也可以对非fulltext索引列进行搜索,只是速度相比,有fulltext的速度要慢
    2. 使用的方式
    基本方式:要在mathc后面加 in boolean mode,(不加说明,默认使用自然排序 in natural language mode)

    select * from apothegm where match(phrase) againts('hard' in boolean mode);
    按单词出现顺序检索,把对应单词用双引号引起来;

    select * from apothegm where match(phrase) againts('“bell book and candle”' in boolean mode);
    可以搜索必须出现,必须不出现,分别用+ 和 -标示:

    select * from apothegm where match(phrase) againts('+bell -candle' in boolean mode);
    可以用*作为通配符,标示以什么开头(前缀)。但是还是必须遵守,单词不能过短的约定。

    6. 查询扩展全文搜索(略)
    三,中文分词
    1. 中文分词的作用?
    把一段中文,像一篇英文文章一样,一个个的单词(中文文章叫做词语)使用空格隔开,然后用编码工具把每个中文词语编译成英文字符乱码,接着,每个英文乱码之间也用空格间隔,这样就成功的把一篇中文翻译成看不懂的英文文章了,我们就可以使用fulltext索引,在这篇看不懂的英文文章中进行全文本搜素。

    ps——注意:
    1. 中文分词的主要作用就,把一段中文,切分成一个个的中文词语。
    2. 然后进过unicode编码,把每个单词编码为英文字符乱码。
    3.这个英文乱码单词是符合fulltext索引单词定义的。
    2. 中文分词的介绍
    中文分词的原理是它有一本自己的字典。一般都有组件,执行某个方法就可以进行中文分词啦。
    大家可以参考github的结巴分词

    ————————————————
    原文链接:https://www.blog8090.com/mysqlzhong-wen-fen-ci-yuan-li/

  • 相关阅读:
    策略梯度(Policy Gradient)
    无约束优化问题
    有约束优化问题
    计算机网络学习资料
    为什么要用等效基带信号?
    通信网实验—话务量分析
    无感数据埋点(自定义注解+aop+异步)
    排序算法
    位运算常见操作
    数据库与缓存一致性的几种实现方式
  • 原文地址:https://www.cnblogs.com/jhcyzxx/p/12462561.html
Copyright © 2011-2022 走看看