精华内容
下载资源
问答
  • 全文索引
    千次阅读
    2021-01-19 20:11:39

    导言:技术是为了解决实际问题的,如果脱离了实际的问题空谈技术,就象是不知道目标而学习一样,效率低且最后一头雾水。因此本文将通过抛出问题--明确目标--解决问题的方式来讲述 全文索引。

    抛出问题:

    1什么是全文索引,为什么要使用全文索引

    扩展问题--分词又是什么?

    2使用全文索引的工作原理是什么。

    问题阐述:

    在讲述什么是全文索引之前,我们来看这么一个场景:

    现在经常看到的“站内”搜索等功能。

    现在你想搜索 “恶魔法则”。那么网页上就会显示 所有和“恶魔法则”相关的数据。

    而这个搜索可以按标题,可以按内容,也可以按作者的综合搜索。如何实现呢?

    对于这个问题,一个刚学sql语句两天的朋友都会说  select * from 表名 where 标题 like '%xxx%' or 内容 like '%xxx%' or 作者 like '%xxx%';

    没错,这个语句是可以实现这种功能。但是效率却无比的低下。(什么?你问为什么?这个问题请自行思考+google)

    那么如何实现这种功能,而又能提高其效率呢?

    其中一种方式便是全文索引。

    全文索引是为了使得“关键词搜索”功能更加的高效能。

    那么什么是全文索引呢?

    我们把应用场景具体化:

    现在有一个文章管理系统,假设所有的文章内容都是存在数据库的一个字段里面,这个字段最长可以存储3000个字节。

    文章的平均长度是2000个字节。

    表结构简化如下:

    文章id

    文章标题

    文章内容

    1

    超级塞亚人

    我是超级塞亚人我喜欢吃苹果

    而这个系统里有几十万篇文章,你想要在这几十万篇文章里找出包含词语“我喜欢吃苹果”的数据。

    上面说过like的效率无比低下。那么如何替换呢?

    如果可以以搜索的“关键词”建立一个索引文件,那么问题似乎会变的容易,索引文件的逻辑结构如下:

    关键词

    文章id

    我喜欢吃苹果

    1

    当你搜索的时候,你会先搜索这个索引表,找到关键词为“我喜欢吃苹果”,然后你就获得了对应的文章id。这样搜索性能就会加快了很多。

    或许你现在似懂非懂,再看个详细例子。

    我们有这么一张数据表:

    文章id

    文章标题

    文章内容

    1

    超级塞亚人

    我是超级塞亚人我喜欢吃苹果,我不是天朝的人,也不是地球人

    2

    天朝大国

    我大天朝威武,我大天朝13亿人,我大天朝

    3

    我喜欢游泳

    游泳有很多好方法

    4

    动画片

    我儿子喜欢看动画片,尤其是七龙珠,因为里面有塞亚人,而且塞亚人喜欢吃苹果,他们不是地球人

    5

    运动

    我喜欢运动,喜欢跑步,喜欢游泳,喜欢健身,喜欢xxoo

    6

    打炮

    我是一个二战的老兵,这是我的回忆录,我最幸福的时光就是在天朝吃着苹果打炮

    7

    。。。

    8

    。。。

    9

    。。。

    然后,根据以上的文章内容,如果建立了一个索引文件(这里忽略索引文件的数据结构,仅仅以一种易于理解的方式呈现):

    关键词

    文章id

    塞亚人

    1,4

    苹果

    1,4,6

    天朝

    1,2,6

    地球

    1,4

    游泳

    3,5

    七龙珠

    4

    喜欢

    1,4,5,6

    那么当我想搜索  “塞亚人”的时候,这个索引文件直接告诉我在文章id为1和4的文章里有这个词。

    这个索引文件就是“全文索引”。

    (注:这里的索引文件仅仅易于理解才做成这种表格形势,在实现上有更复杂的数据结构--为了是在这么多个关键词里迅速的找到你想找的关键词啦!这里忽略数据结构的知识,仅从本质上说明全文索引是什么,为了解决什么,即使你没有任何的专业背景知识,只要你学过任何一门数据库的sql语句,相信都能看得懂啦!)

    到这里,我们已经解决了一个问题--什么是全文索引。^^

    通过观察上面的例子,如果你有心,你可能会思考这么一个问题:

    超级塞亚人,是一个词汇呢,还是分为“超级”,“塞亚人”两个词汇呢?

    这就是“分词”。

    现在有很多专门的分词系统啦!至于算法这里并不多介绍,(因为这不仅仅包括计算机知识啦,想做的更好得需要语言学专家帮助哦)

    现在我们已经知道了全文索引和分词。

    那么如何使用呢?也就是说你如何使用全文索引和分词的方式来帮助优化你的搜索呢?

    大体方案如下:

    为了简化概念,我们只从一个固定的套路开始讨论,这样就能省略数据源这些概念,而专心其工作方式啦:

    需要工作的程序:索引程序,分词程序,数据库。

    工作原理:

    1、索引程序从数据库读取数据,比如上面例子中的数据表,索引程序通过sql语句:select 文章id,文章标题,文章内容 from 文章表.获得文章的相关数据

    2、索引程序对需要索引的内容进行“分词”,而这里的分词就是调用分词程序啦!

    3、索引程序对分好词的一个个词条加入索引文件。

    在你写的代码里,原来到数据库----like %xxx%-----的语句

    就变成了到索引文件里去查找,从而找到相应的数据(这点相信你已经理解啦!)

    好了,原理部分介绍到这。

    mysql现在一般使用的版本其实也支持全文索引啦,索引类型为fulltext,只不过他的功能还不够强大:

    是对中文的支持不够好,无法智能分词

    不过要是纯英文搜索用他还是可以的,只不过要注意有个停止词的概念哦!

    那么用什么方法可以快速解决中文搜索的问题呢?

    你一定听说过sphinx。(即使没听说过也没关系啦,之后我们会以这个为例子来详细讲解)

    coreseek=sphinx+mmesg 这个程序就可以解决这个问题的啦。

    sphinx就是上面说的索引程序啦。

    mmseg就是分词程序啦。

    国内有人修改了sphinx源码,内建和mmseg配合,整合到一起就是coreseek啦!

    在下一篇中,

    1我们会结合上面的原理,具体分析coreseek的使用参数。

    2最后给出具体的分词索引方案。而不仅仅是“照着葫芦画瓢”。

    留下思考的问题:

    上面说的工作原理当中,sphinx读取数据库生成索引。那么如果sphinx生成完索引,mysql加入了新数据,这不是没有加入到索引当中吗?如何解决?

    更多相关内容
  • 在MySql数据库中,有四种索引:聚焦索引(主键索引)、普通索引、唯一索引以及我们这里将要介绍的全文索引(FUNLLTEXT INDEX)。 全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术...
  • 数据库【存储】|【全文目录】节点是用于保存和管理【全文索引】的节点。全文目录通常是由同一数据库中的零个或多个数据表的全文索引构成的。需要注意的是,只能为每个数据表创建一个全文索引。因此,一旦在某个数据...
  • Oracle自带全文索引

    2020-12-14 23:37:35
     当需要在大量文章中通过关键字搜索文章时,Oracle自带的全文索引对于提高搜索性能非常有帮助,并且使用也很方便。  使用前的准备工作:  1、先查看oracle是否自带有ctxsys用户,如果没有该用户则不能使用全文...
  • 代码如下:–1、为数据库启用SQL Server全文索引EXEC sp_fulltext_database ‘enable’ –2、创建全文目录–(此处若出错“未安装全文搜索或无法加载某一全文组件”,则可能是未启动或未安装此服务)EXEC sp_fulltext_...
  • 全文检索可以对varchar,text,image型字段进行检索,但一个表最多只能建一个全文索引SQL Server 2000 引入了对存储在 image 列中的这些类型的数据执行全文检索的能力。如果没有全文索引,对字符的模糊查询只能对基表...
  • 主要介绍了oracle10g全文索引自动同步语句使用方法,需要的朋友可以参考下
  • 主要介绍了MySQL全文索引、联合索引、like查询、json查询速度大比拼,通过实例代码截图的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 本文从以下几个方面介绍下MySQL全文索引的基础知识: MySQL全文索引的几个注意事项 全文索引的语法 几种搜索类型的简介 几种搜索类型的实例 全文索引的几个注意事项 搜索必须在类型为fulltext的索引列上,match...
  • 前言:本文简单讲述全文索引的应用实例,MYSQL演示版本5.5.24。 Q:全文索引适用于什么场合? A:全文索引是目前实现大数据搜索的关键技术。 至于更详细的介绍请自行百度,本文不再阐述。 ————————————...
  • 北京内容摘要:Lucene是一个基于Java的全文索引工具包。基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史全文检索的实现:Luene全文索引和数据库索引的比较中文切分词机制简介:基于词库和自动切分词算法...
  • C#基于.net实现的本地文档的全文索引定位器 C#基于.net实现的本地文档的全文索引定位器 C#基于.net实现的本地文档的全文索引定位器 C#基于.net实现的本地文档的全文索引定位...
  • 该文档详述如何创建全文索引优化模糊查询,使用全文索引的填充因子避免漏查多查
  • MySQL 全文索引

    千次阅读 2021-09-23 13:09:16
    关系型数据库中的全文索引应该也是从这些搜索引擎里摸索出来的。 全文索引介绍: 在数据库中常用的查询方式一般是 等价,范围方式。当然也有LIKE %的模糊查询,虽然用不到索引,在文本内容比较少时是比较合适,...

    说到查询,日常中常用的baidu,cnbing ,google等之类的网站。关系型数据库中的全文索引应该也是从这些搜索引擎里摸索出来的。


    全文索引介绍:

    在数据库中常用的查询方式一般是 等价,范围方式。当然也有LIKE %的模糊查询,虽然用不到索引,在文本内容比较少时是比较合适,但是对于大量的文本数据检索,全文索引在大量的数据面前,能比 LIKE % 快很多,速度不是一个数量级。所以总结下来,索引全文索引就是为这种场景设计的。

    MySQL中的全文索引表跟普通的表生成的文件不一样,在底层文件会生成fts开头的索引文件,只要在实际生成文件包含这些,就说明表上创建了全文索引。

    mysql> CREATE TABLE my_stopwords(value VARCHAR(30)) ENGINE = INNODB;
    
    mysql> CREATE FULLTEXT INDEX idx ON table_name(`columns`);
    
    mysql> SELECT  *  FROM  INFORMATION_SCHEMA.TABLESPACES_EXTENSIONS WHERE TABLESPACE_NAME LIKE 'db7/fts%';
    
    +---------------------------------------------------+------------------+
    | TABLESPACE_NAME                                   | ENGINE_ATTRIBUTE |
    +---------------------------------------------------+------------------+
    | db7/fts_00000000000005c4_00000000000002fa_index_1 | NULL             |
    | db7/fts_00000000000005c4_00000000000002fa_index_2 | NULL             |
    | db7/fts_00000000000005c4_00000000000002fa_index_3 | NULL             |
    | db7/fts_00000000000005c4_00000000000002fa_index_4 | NULL             |
    | db7/fts_00000000000005c4_00000000000002fa_index_5 | NULL             |
    | db7/fts_00000000000005c4_00000000000002fa_index_6 | NULL             |
    | db7/fts_00000000000005c4_being_deleted            | NULL             |
    | db7/fts_00000000000005c4_being_deleted_cache      | NULL             |
    | db7/fts_00000000000005c4_config                   | NULL             |
    | db7/fts_00000000000005c4_deleted                  | NULL             |
    | db7/fts_00000000000005c4_deleted_cache            | NULL             |
    +---------------------------------------------------+------------------+

    全文索引机制:


    1. InnoDB全文索引设计-反向索引:

    全文索引采用了反向索引(Inverted index)设计。反向索引存储单词列表,对于每个单词,存储该单词出现的文档列表。为了支持邻近搜索,每个单词的位置信息也以字节偏移量的形式存储。
    这里提到了反向索引:
    反向索引:根据关键词反向得到该关键词的其它所有信息,比如该关键词所在的文件,在文件里出现的次数和行数等,这些信息就是用户查找该关键词时所要用的信息.
    举个例子:

    #用不同的数字索引不同的句子(比如以下三句在文本中是按照0,1,2的顺序排列的)
    
    0 : "I love you"
    1 : "I love you too "
    2 : "I dislike you"
    #如果要用单词作为索引,而句子的位置作为被索引的元素,那么索引就发生了倒置:
    
    "I" : {0,1,2}
    "love" : {0, 1}
    "you" : {0,1,2}
    "dislike" : {2}
    #如果要检索 "I dislike you" 这句话,那么就可以这么计算 :  {0,1,2} 交集 {0,1,2}交集 {2}  

    这样就比较好理解了。


    2. InnoDB全文索引DOC_ID和FTS_DOC_ID列

    InnoDB使用一个称为DOC_ID的唯一文档标识符来将全文索引中的单词映射到该单词出现的文档记录中。映射需要索引表上的FTS_DOC_ID列。如果没有定义FTS_DOC_ID列,InnoDB会在创建全文索引时自动添加一个隐藏的FTS_DOC_ID列。

    mysql> CREATE TABLE opening_lines (
                id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
                opening_line TEXT(500),
                author VARCHAR(200),
                title VARCHAR(200)
                ) ENGINE=InnoDB;
    Query OK, 0 rows affected (0.03 sec)
    mysql> CREATE FULLTEXT INDEX idx ON opening_lines(opening_line);
    Query OK, 0 rows affected, 1 warning (0.26 sec)
    Records: 0  Duplicates: 0  Warnings: 1
    
    mysql> show warnings;
    +---------+------+--------------------------------------------------+
    | Level   | Code | Message                                          |
    +---------+------+--------------------------------------------------+
    | Warning |  124 | InnoDB rebuilding table to add column FTS_DOC_ID |
    +---------+------+--------------------------------------------------+
    1 row in set (0.00 sec)

    InnoDB创建一个隐藏的FTS_DOC_ID列,并在FTS_DOC_ID列上创建一个唯一索引(FTS_DOC_ID_INDEX)。如果你想创建自己的FTS_DOC_ID列,列必须定义为BIGINT UNSIGNED NOT NULL,并命名为FTS_DOC_ID(全大写),并且以避免空值或重复值, 不能重用FTS_DOC_ID值。

    mysql> CREATE TABLE `opening_lines` (
      `FTS_DOC_ID` bigint unsigned NOT NULL AUTO_INCREMENT,
      `opening_line` text COLLATE utf8mb4_bin,
      `author` varchar(200) COLLATE utf8mb4_bin DEFAULT NULL,
      `title` varchar(200) COLLATE utf8mb4_bin DEFAULT NULL,
      PRIMARY KEY (`FTS_DOC_ID`)
    ) ENGINE=InnoDB;
    
     mysql> CREATE UNIQUE INDEX FTS_DOC_ID_INDEX on opening_lines(FTS_DOC_ID);

    除此之外FTS_DOC_ID_INDEX不能定义为降序索引,因为InnoDB SQL解析器不使用降序索引。
    为了避免重新构建表,在删除全文索引时保留FTS_DOC_ID列


    3. InnoDB全文索引缓存:

    插入文档时,将对其进行标记,并将单个单词和相关数据插入全文索引。这个过程,即使对于小文档,也可能导致大量的小插入到辅助索引表中,使对这些表的并发访问成为争用点。为了避免这个问题,InnoDB使用全文索引缓存来临时缓存最近插入的索引表。这个内存缓存结构保存插入,直到缓存满了,然后批量刷新到磁盘(到辅助索引表)

    mysql> SELECT * FROMINFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;

    物理文件对应缓存:

    • 辅助索引表名以fts_为前缀,以index_#为后缀。Index_1~index_6前六个索引表组成了反向索引。当传入文档被标记化时,单个单词(也称为“标记”)将与位置信息和相关的DOC_ID一起插入索引表中。根据单词第一个字符的字符集排序权重,在六个索引表中对单词进行完全排序和分区。
      反向索引被划分为的6个辅助索引表,以支持并行索引创建。通过innodb_ft_sort_pll_degree两个线程标记、排序并将单词和相关数据插入索引表。
    mysql>  show variables like 'innodb_ft_sort_pll_degree';
    +---------------------------+-------+
    | Variable_name             | Value |
    +---------------------------+-------+
    | innodb_ft_sort_pll_degree | 2     |
    +---------------------------+-------+
    1 row in set (0.00 sec)
    • fts_deleted and ftsdeleted_cache
      包含已删除但其数据尚未从全文索引中删除的文档的文档id (DOC_ID)。fts
      deleted_cache是fts_deleted表的内存版本。

    • fts_being_deleted and ftsbeing_deleted_cache
      包含被删除文档的文档id (DOC_ID),这些文档的数据目前正在从全文索引中删除。fts
      being_deleted_cache表是fts_being_deleted表的内存版本。

    • fts_*_config
      存储关于全文索引的内部状态的信息。最重要的是,它存储FTS_SYNCED_DOC_ID,用于标识已解析并刷新到磁盘的文档。在崩溃恢复的情况下,FTS_SYNCED_DOC_ID值用于标识尚未刷新到磁盘的文档,以便可以重新解析文档并将其添加回全文索引缓存

    #系统内存表支持查询: 
    SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_CONFIG;

    缓存和批刷新行为避免了对辅助索引表的频繁更新,这可能会在繁忙的插入和更新期间导致并发访问问题。批处理技术还避免了对同一个单词的多次插入,并尽量减少重复条目。不是单独刷新每个单词,而是将相同单词的插入合并并作为单个条目刷新到磁盘,从而在保持辅助索引表尽可能小的同时提高插入效率。

    innodb_ft_cache_size:变量用于配置全文索引缓存的大小(以每个表为基础),这将影响全文索引缓存刷新的频率。
    innodb_ft_total_cache_size:变量为给定实例中的所有表定义一个全局全文索引缓存大小限制。

    全文索引缓存存储与辅助索引表相同的信息。但是,全文索引缓存只缓存最近插入行的标记化数据。在查询时,已经刷新到磁盘(到辅助索引表)的数据不会返回到全文索引缓存中。直接查询辅助索引表中的数据,并在返回之前将辅助索引表的结果与来自全文索引缓存的结果合并。


    4. InnoDB全文索引删除处理

    删除具有全文索引列的记录可能导致辅助索引表中的大量小删除,使对这些表的并发访问成为争用点。为了避免这个问题,每当从索引表中删除一条记录时,已删除文档的DOC_ID将记录在一个特殊的FTS_DELETED表中,而已索引的记录将保留在全文索引中。在返回查询结果之前,使用FTS_DELETED表中的信息过滤掉已删除的doc_id。这种设计的好处是删除既快又便宜。缺点是删除记录后索引的大小不会立即减少。
    要删除已删除记录的全文索引项,在索引表上使用innodb_optimize_fulltext_only= on命令执行OPTIMIZE TABLE命令重建全文索引


    5. InnoDB全文索引事务处理

    InnoDB全文索引由于其缓存和批处理行为而具有特殊的事务处理特征。具体来说,全文索引上的更新和插入是在事务提交时处理的,这意味着全文搜索只能看到提交的数据。全文搜索只在插入的行提交后返回结果。批量操作下,查询实时查询 有可能数据查不到,最终一致性。


    6. 全文索引的限制:

    • 全文索引只能用于InnoDB或MyISAM表,并且只能为CHAR、VARCHAR或TEXT列创建。
    • MySQL提供了一个内置的全文ngram解析器,支持中文,日文和韩文(CJK),以及一个可安装的MeCab日文全文解析器插件。 “ngram全文解析器”和“MeCab全文解析器插件”
    • FULLTEXT索引定义可以在创建表时在CREATE TABLE语句中给出,也可以稍后使用ALTER TABLE或CREATE index添加。
    • 对于大型数据集,将数据加载到一个没有FULLTEXT索引的表中,然后在此之后创建索引,比将数据加载到一个已有FULLTEXT索引的表中要快得多。
    • 分区表不支持全文搜索


    全文索引三种类型查询方式


    1. A natural language search

    自然语言搜索将搜索字符串解释为自然人类语言中的短语(自由文本中的短语)。除了双引号(")字符外,没有特殊操作符。stopword列表应用。

    a.所为stopword a is in or when 等等
    中文的话前面这句话,“在”、“里面”、“也”、“的”、“它”、“为”这些词都是停止词。这些词因为使用频率过高,几乎每个语句基本都会有,所以搜索引擎开将这一类词语全部忽略掉。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
    +-------+
    | value |
    +-------+
    | a     |
    | about |
    | an    |
    | are   |
    。。。。。
    | who   |
    | will  |
    | the   |
    | www   |
    +-------+
    36 rows in set (0.00 sec)

    也可以自定义stopword,自主性比较高

    mysql> CREATE TABLE my_stopwords(value VARCHAR(30)) ENGINE = INNODB;
    mysql> INSERT INTO my_stopwords(value) VALUES ('Ishmael');
    mysql> CREATE FULLTEXT INDEX idx ON my_stopwords(`value`);
    mysql> SET GLOBAL innodb_ft_server_stopword_table = 'db7/my_stopwords';

    b.自然语言搜索,使用IN NATURAL LANGUAGE MODE修饰符时,MATCH()函数会针对文本集合执行字符串的自然语言搜索。

    mysql> CREATE TABLE articles (
              id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
              title VARCHAR(200),
              body TEXT,
              FULLTEXT (title,body)
            ) ENGINE=InnoDB;
    Query OK, 0 rows affected (0.08 sec)
    
    mysql> INSERT INTO articles (title,body) VALUES
            ('MySQL Tutorial','DBMS stands for DataBase ...'),
            ('How To Use MySQL Well','After you went through a ...'),
            ('Optimizing MySQL','In this tutorial, we show ...'),
            ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
            ('MySQL vs. YourSQL','In the following database comparison ...'),
            ('MySQL Security','When configured properly, MySQL ...');
    
    mysql> SELECT * FROM articles
            WHERE MATCH (title,body)
            AGAINST ('database' IN NATURAL LANGUAGE MODE);

    2. A boolean search

    使用特殊查询语言的规则解释搜索字符串。字符串包含要搜索的单词。它还可以包含一些操作符,这些操作符指定了一些要求,例如某个单词必须在匹配的行中出现或不出现,或者该单词的权重应该高于或低于通常值。

    mysql> SELECT * FROM articles WHERE MATCH (title,body)
        AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);

    条件:

    • stands for AND
    • stands for NOT
      除此之外 > < ( ) ~ * 等条件符号


    3. A query expansion search

    查询扩展搜索是对自然语言搜索的修改。搜索字符串用于执行自然语言搜索。然后将搜索返回的最相关行的单词添加到搜索字符串中,并再次执行搜索。查询返回第二次搜索的行.

    mysql>DROP TABLE IF EXISTS articles01;
    mysql>CREATE TABLE articles01 (
              id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
              title VARCHAR(200),
              FULLTEXT (title)
            ) ENGINE=InnoDB;
    mysql>INSERT INTO articles01 (title) VALUES
            ('MySQL Tutorial'),
            ('Optimizing Tutorial'),
            ('analyze db');

    可以分为两个阶段:

    一阶段:第一条sql语句直返回MySQL包含的数据,

    mysql> SELECT * FROM articles
        WHERE MATCH (title,body)
        AGAINST ('database' IN NATURAL LANGUAGE MODE);
    +----+----------------+
    | id | title          |
    +----+----------------+
    |  1 | MySQL Tutorial |
    +----+----------------+

    二阶段:QUERY EXPANSION是上述结果当中词汇,再次进行对应的查询。

    WHERE MATCH (title,body)
        AGAINST ('database' WITH QUERY EXPANSION);
    +----+---------------------+
    | id | title               |
    +----+---------------------+
    |  1 | MySQL Tutorial      |
    |  2 | Optimizing Tutorial |
    +----+---------------------+

    就是使用结果集再次进行匹配。


    解析器

    全文解析提供两种解析方式:

    • ngram解析器:

    内置的MySQL全文解析器使用单词之间的空格作为分隔符,以确定单词的开始和结束位置,这在处理不使用单词分隔符的表意语言时是一个限制。为了解决这个问题,MySQL提供了一个支持中文、日文和韩文(CJK)的ngram全文解析器。5.7.6版本开始支持中文全文索引。
    ngram是给定文本序列中的n个字符的连续序列。ngram解析器将文本序列标记为n个字符的连续序列。
    比如:abcd字段

    n=1: 'a', 'b', 'c', 'd'
    n=2: 'ab', 'bc', 'cd'
    n=3: 'abc', 'bcd'
    n=4: 'abcd'
    [mysqld] 
    ngram_token_size=2  (1~10)

    定义了拆分的单词。
    比如 ‘abcd’ 采用n=2的方式 ‘ab’, ‘bc’, ‘cd’
    ‘a bc’ 就是 ‘bc’
    “生日快乐” 中文就会拆分成 “生日”“快乐” 2个分词

    对于中文来说确实挺麻烦的事情,直接1 就可以

    • MeCab全文解析器

    MeCab全文文本解析器插件是一个日文全文文本解析器插件,它将文本序列标记为有意义的单词。
    除了将文本标记为有意义的单词外,MeCab索引通常比ngram索引更小,而且MeCab全文搜索通常更快。
    缺点是与ngram全文解析器相比,MeCab全文解析器对文档进行标记需要更长的时间。

    配置方式如下:

    [mysqld]
    loose-mecab-rc-file=MYSQL_HOME/lib/mecab/etc/mecabrc
    innodb_ft_min_token_size=1

    5. 参数

    使用该功能就需要合理配置参数:

    image.png

    6. 总结

    mysql的全文索引只有一种方法判断相关性,就是词频,索引并不会记录匹配的词在字符串中的位置。并且,全文索引和数据量有较大的关系,全文索引只会全部在内存中时,性能才会很好,因此当全文索引过大,不能全部读入进内存,性能就会比较差。
    可以通过一下点,思考下全文索引的问题:
    1、修改一段文本中的100个单词时,需要索引100次。

    2、全文索引的长度对性能的影响也是巨大的

    3、全文索引会产生更多的碎片,需要频繁的优化(optimize table)操作

    4、内存和数据容量也是常可观,所以需要规划和参数控制这部分

    5、因为mysql复制机制是基于逻辑复制,产生的binlog毕竟很大,那就会出现主从延迟等问题。

    6、词分割(token_size)也是一个问题,单个汉字也能表达出不同的意思。

    7、查询上:如果sql中包含match against,而索引列上又正好有全文索引,那么mysql就一定会使用全文索引,如果此时还有其他索引,mysql也不会去对比那个索引性能更高。

    当然不管那个数据库都有局限性,合理使用采用DBA之道。

    image.png

    展开全文
  • Full Text Search Service包含在SQL Server 7.0中,在SQL Server 7 Destop版中不起作用。...可以在SQL Server EnterPrise Manager中启动这个服务,就可以在表中加入全文索引了。文中介绍了对表设置全文索引应用步骤。
  • 全文索引的案例 空间索引 索引的优点 索引的缺点 创建索引的原则 Hash算法 二叉树 平衡二叉树 BTREE树 每文一语 索引介绍 索引是通过某种算法,构建出一个数据模型,用于快速找出在某个列中有一特定值的...

    目录

    索引介绍

    Hash索引和B+tree索引的区别

    应用场景

    索引分类

    普通索引

    创建单列索引——普通索引(3种语法)

    查看数据库中的索引

    查看数据表中的索引

     删除索引

    唯一索引

    主键索引

    组合索引

    创建和删除组合索引

    全文索引

    全文索引的案例

    空间索引

    索引的优点

    索引的缺点

    创建索引的原则

    Hash算法

    二叉树

    平衡二叉树

    BTREE树

     每文一语


    索引介绍

    索引是通过某种算法,构建出一个数据模型,用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。

    索引类似一本书的目录,比如要查找’student’这个单词,可以先找到s开头的页然后向后查找,这个就类似索引。

    一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。
    这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。
    换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。

    索引是存储引擎用来快速查找记录的一种数据结构,按照实现的方式类分,主要有Hash索引B+Tree索引 

    Hash索引和B+tree索引的区别

    1、在查询速度上,如果是等值查询,那么Hash索引明显有绝对优势,因为只需要经过一次 Hash 算法即可找到相应的键值,复杂度为O(1);当然了,这个前提是键值都是唯一的

    如果键值不是唯一(或存在Hash冲突),就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据,这时候复杂度会变成O(n),降低了Hash索引的查找效率。

    所以,Hash 索引通常不会用到重复值多的列上,比如列为性别、年龄的情况等(当然B+tree索引也不适合这种离散型低的字段上);

    2、Hash 索引是无序的,如果是范围查询检索,这时候 Hash 索引就无法起到作用,即使原先是有序的键值,经过 Hash 算法后,也会变成不连续的了。因此

    ①、Hash 索引只支持等值比较查询、无法索成范围查询检索,B+tree索引的叶子节点形成有序链表,便于范围查询。

    ②、Hash 索引无法做 like ‘xxx%’ 这样的部分模糊查询,因为需要对 完整 key 做 Hash 计算,定位bucket。而 B+tree 索引具有最左前缀匹配,可以进行部分模糊查询。

    ③、Hash索引中存放的是经过Hash计算之后的Hash值,而且Hash值的大小关系并不一定和Hash运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算。B+tree 索引的叶子节点形成有序链表,可用于排序。

    3、Hash 索引不支持多列联合索引,对于联合索引来说,Hash 索引在计算 Hash 值的时候是将索引键合并后再一起计算 Hash 值,不会针对每个索引单独计算 Hash 值。因此如果用到联合索引的一个或者几个索引时,联合索引无法被利用;

    4、因为存在哈希碰撞问题,在有大量重复键值情况下,哈希索引的效率极低。B+tree 所有查询都要找到叶子节点,性能稳定;

    应用场景

    1、大多数场景下,都会有组合查询,范围查询、排序、分组、模糊查询等查询特征,Hash 索引无法满足要求,建议数据库使用B+树索引。

    2、在离散型高,数据基数大,且等值查询时候,Hash索引有优势。

    索引分类

    按照功能划分,索引划为以下分类:

    普通索引

    单列索引一个索引只包含单个列,但一个表中可以有多个单列索引;

    普通索引MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。

    创建单列索引——普通索引(3种语法)

    create database mydb5;
    use mydb5;
    
    -- 方式1-创建表的时候直接指定
    create  table student(
        sid int primary key,
        card_id varchar(20),
        name varchar(20),
        gender varchar(20),
        age int,
        birth date, 
        phone_num varchar(20),
        score double,
        index index_name(name) -- 给name列创建索引
    );
    

     直接使用index index_name(列名)即可

    -- 方式2-直接创建
    -- create index indexname on tablename(columnname); 
    create index index_gender on student(gender); 
    
    -- 方式3-修改表结构(添加索引)
    -- alter table tablename add index indexname(columnname)
    alter table student add index index_age(age);
    

    查看数据库中的索引

    -- 1、查看数据库所有索引 
    -- select * from mysql.`innodb_index_stats` a where a.`database_name` = '数据库名’; 
    select * from mysql.`innodb_index_stats` a where a.`database_name` = 'mydb5';
    
    

    查看数据表中的索引

    -- 2、查看表中所有索引 
    -- select * from mysql.`innodb_index_stats` a where a.`database_name` = '数据库名' and a.table_name like '%表名%’; 
    select * from mysql.`innodb_index_stats` a where a.`database_name` = 'mydb5' and a.table_name like '%student%';
    
    

    -- 3、查看表中所有索引 
    -- show index from table_name; 
    show index from student;
    

     删除索引

    drop index 索引名 on 表名 
    -- 或 
    alter table 表名 drop index 索引名 
    
    drop index index_gender on student 
    -- 或 
    alter table student drop index index_name
    

    唯一索引

    唯一索引与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

    -- 方式1-创建表的时候直接指定
    create  table student2(
        sid int primary key,
        card_id varchar(20),
        name varchar(20),
        gender varchar(20),
        age int,
        birth date, 
        phone_num varchar(20),
        score double,
        unique index_card_id(card_id) -- 给card_id列创建索引
    );
    -- 方式2-直接创建
    -- create unique index 索引名 on 表名(列名) 
    create unique index index_card_id on student2(card_id);
    
    -- 方式3-修改表结构(添加索引)
    -- alter table 表名 add unique [索引名] (列名)
    alter table student2 add unique index_phone_num(phone_num)
    

    可以发现,就像我们创建普通索引的时候一样,将index前面加一个unique即可

    删除索引的方法也是一样的

    drop index index_card_id on student2 
    -- 或 
    alter table student2 drop index index_phone_num
    

    主键索引

    每张表一般都会有自己的主键,当我们在创建表时,MySQL会自动在主键列上建立一个索引,这就是主键索引。主键是具有唯一性并且不允许为NULL,所以他是一种特殊的唯一索引。

    组合索引

    组合索引也叫复合索引,指的是我们在建立索引的时候使用多个字段,例如同时使用身份证和手机号建立索引,同样的可以建立为普通索引或者是唯一索引。
    复合索引的使用复合最左原则。

    -- 创建索引的基本语法 
    create index indexname on table_name(column1(length),column2(length)); 
    

    创建和删除组合索引

    -- 组合索引
    use mydb5;
    -- 创建索引的基本语法-- 普通索引
    -- create index indexname on table_name(column1(length),column2(length)); 
    create index index_phone_name on student(phone_num,name);
    -- 操作-删除索引
     drop index index_phone_name on student; 
    -- 创建索引的基本语法-- 唯一索引
    create  unique index index_phone_name on student(phone_num,name); 
    
    select * from student where name = '张三'; 
    select * from student where phone_num = '15100046637'; 
    select * from student where phone_num = '15100046637' and name = '张三'; 
    select * from student where name = '张三' and phone_num = '15100046637'; 
    /* 
      三条sql只有 2 、 3、4能使用的到索引idx_phone_name,因为条件里面必须包含索引前面的字段
      才能够进行匹配。
      而3和4相比where条件的顺序不一样,为什么4可以用到索引呢?是因为mysql本身就有一层sql优化,
      他会根据sql来识别出来该用哪个索引,我们可以理解为3和4在mysql眼中是等价的。 
    
    */
    
    

    注意组合索引的匹配是从左到右依次

    总结索引的匹配顺序:

    首先根据创建组合索引的顺序,进行匹配,如果第一个是该索引的第一个,则可以用到该索引,如果第一个不是的话,而无法使用索引的效果,后期在MySQL优化里面会讲到索引的一些特性和具体使用。

    全文索引

    全文索引的关键字是fulltext

    全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较,它更像是一个搜索引擎,基于相似度的查询,而不是简单的where语句的参数匹配。

    用 like + % 就可以实现模糊匹配了,为什么还要全文索引?like + % 在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比 like + % 快 N 倍,速度不是一个数量级,但是全文索引可能存在精度问题。

    全文索引的版本、存储引擎、数据类型的支持情况:
    MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;

    MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;

    只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引;

    在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用create index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多;

    测试或使用全文索引时,要先看一下自己的 MySQL 版本、存储引擎和数据类型是否支持全文索引。

    MySQL 中的全文索引,有两个变量,最小搜索长度和最大搜索长度,对于长度小于最小搜索长度和大于最大搜索长度的词语,都不会被索引。通俗点就是说,想对一个词语使用全文索引搜索,那么这个词语的长度必须在以上两个变量的区间内。这两个的默认值可以使用以下命令查看:

    #

    参数名称

    默认值

    最小值

    最大值

    作用

    1

    ft_min_word_len

    4

    1

    3600

    MyISAM 引擎表全文索引包含的最小词长度

    2

    ft_query_expansion_limit

    20

    0

    1000

    MyISAM引擎表使用 with query expansion 进行全文搜索的最大匹配数

    3

    innodb_ft_min_token_size

    3

    0

    16

    InnoDB 引擎表全文索引包含的最小词长度

    4

    innodb_ft_max_token_size

    84

    10

    84

    InnoDB 引擎表全文索引包含的最大词长度

    -- 创建表的时候添加全文索引
    create table t_article (
         id int primary key auto_increment ,
         title varchar(255) ,
         content varchar(1000) ,
         writing_date date -- , 
         -- fulltext (content) -- 创建全文检索
    );
    

    全文索引的案例

    insert into t_article values(null,"Yesterday Once More","When I was young I listen to the radio",'2021-10-01');
    insert into t_article values(null,"Right Here Waiting","Oceans apart, day after day,and I slowly go insane",'2021-10-02'); 
    insert into t_article values(null,"My Heart Will Go On","every night in my dreams,i see you, i feel you",'2021-10-03');
    insert into t_article values(null,"Everything I Do","eLook into my eyes,You will see what you mean to me",'2021-10-04');
    insert into t_article values(null,"Called To Say I Love You","say love you no new year's day, to celebrate",'2021-10-05');
    insert into t_article values(null,"Nothing's Gonna Change My Love For You","if i had to live my life without you near me",'2021-10-06');
    insert into t_article values(null,"Everybody","We're gonna bring the flavor show U how.",'2021-10-07');
    
    -- 修改表结构添加全文索引
    alter table t_article add fulltext index_content(content)
     
    -- 直接添加全文索引
    create fulltext index index_content on t_article(content);
    

    使用全文索引

    和常用的模糊匹配使用 like + % 不同,全文索引有自己的语法格式,使用 match 和 against 关键字,格式:

    select * from t_article where match(content) against('yo’); -- 没有结果 单词数需要大于等于3 
    select * from t_article where match(content) against('you'); -- 有结果
    

    空间索引

    MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型
    空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。
    MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。
    创建空间索引的列,必须将其声明为NOT NULL。
    空间索引一般是用的比较少,了解即可。

    类型

    含义

    说明

    Geometry

    空间数据

    任何一种空间类型

    Point

    坐标值

    LineString

    线

    有一系列点连接而成

    Polygon

    多边形

    由多条线组成

    create table shop_info (
      id  int  primary key auto_increment comment 'id',
      shop_name varchar(64) not null comment '门店名称',
      geom_point geometry not null comment '经纬度’,
      spatial key geom_index(geom_point)
    );
    

    索引的优点

    大大加快数据的查询速度

    使用分组和排序进行数据查询时,可以显著减少查询时分组和排序的时间

    创建唯一索引,能够保证数据库表中每一行数据的唯一性

    在实现数据的参考完整性方面,可以加速表和表之间的连接

    索引的缺点

    创建索引和维护索引需要消耗时间,并且随着数据量的增加,时间也会增加

    索引需要占据磁盘空间

    对数据表中的数据进行增加,修改,删除时,索引也要动态的维护,降低了维护的速度


    创建索引的原则

    更新频繁的列不应设置索引

    数据量小的表不要使用索引(毕竟总共2页的文档,还要目录吗?)

    重复数据多的字段不应设为索引(比如性别,只有男和女,一般来说:重复的数据超过百分之15就不该建索引)

    首先应该考虑对where 和 order by 涉及的列上建立索引

    Hash算法

    二叉树

    平衡二叉树

    BTREE树

    目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构,Btree结构可以有效的解决之前的相关算法遇到的问题。

     每文一语

    每一次的开始都是有意义的!

    展开全文
  • mysql全文索引

    千次阅读 2022-01-13 13:28:08
    这个时候,就可通过全文索引(Full-Text Search)来进行优化。 全文索引(Full-Text Search)是将存储于数据库中的整本书或整篇文章中的任意信息查找出来的技术。它可以根据需要获得全文中有关章、节、段、句、词等...

            众所周知,使用like '%xxx%'进行模糊查询时,字段的索引就会失效。因此,在数据量大的情况下,通过此种方式查询的效率极低。这个时候,就可通过全文索引(Full-Text Search)来进行优化。

            全文索引(Full-Text Search)是将存储于数据库中的整本书或整篇文章中的任意信息查找出来的技术。它可以根据需要获得全文中有关章、节、段、句、词等信息,也可以进行各种统计和分析。

            全文索引一般是通过倒排索引实现的。

    一、倒排索引

            倒排索引同 B+Tree 一样,也是一种索引结构。它在辅助表中存储了单词与单词自身在一个或多个文档中所在位置之间的映射,这通常利用关联数组实现,拥有两种表现形式:

            inverted file index:{单词,单词所在文档的id}

            full inverted index:{单词,(单词所在文档的id,再具体文档中的位置)}

    创建删除全文索引

    若需对大量数据设置全文索引,建议先添加数据再创建索引。

    1、创建表时创建全文索引

    create table 表名(字段名1,字段名2,字段名3,字段名4,FULLTEXT full_index_name (字段名))ENGINE=InnoDB;

    2、为已有表添加全文索引

    create fulltext index 索引名称 on 表名(字段名)

    3、删除全文索引

    alter table 表名
        drop index 索引名;

    二、使用全文索引

    语法:

    MATCH(col1,col2,...) AGAINST(expr[search_modifier])
    search_modifier:
    {
        IN NATURAL LANGUAGE MODE
        | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
        | IN BOOLEAN MODE
        | WITH QUERY EXPANSION
    }

    全文索引分为三种类型:自然语言的全文索引(Natural Language)、布尔全文索引(Boolean)和查询扩展搜索。

    在不使用in ... mode的情况下,默认采用的是自然语言的全文索引。

    1、自然语言的全文索引

            自然语言的全文索引可以计算每个文档对象和查询的相关性。

    
    SELECT
        *,
        MATCH (字段名) against ( '需要符合的内容' ) AS Relevance 
    FROM
        表名;

    相关性主要与以下条件有关:

    • word 是否在文档中出现

    • word 在文档中出现的次数

    • word 在索引列中的数量

    • 多少个文档包含该 word

    2、布尔全文索引

            布尔搜索使用特殊查询语言的规则来解释搜索字符串,该字符串包含要搜索的词,它还可以包含指定要求的运算符,例如匹配行中必须存在或不存在某个词,或者它的权重应高于或低于通常情况。

    Boolean 全文检索支持的类型(可以通过ft_boolean_syntax变量来查看)包括:

    • +:表示该 word 必须存在

    • -:表示该 word 必须不存在

    • (no operator)表示该 word 是可选的,但是如果出现,其相关性会更高

    • @distance表示查询的多个单词之间的距离是否在 distance 之内,distance 的单位是字节,这种全文检索的查询也称为 Proximity Search,如 MATCH(context) AGAINST('"Pease hot"@30' IN BOOLEAN MODE)语句表示字符串 Pease 和 hot 之间的距离需在30字节内

    • >:表示出现该单词时增加相关性

    • <:表示出现该单词时降低相关性

    • ~:表示允许出现该单词,但出现时相关性为负

    • * :表示以该单词开头的单词,如 lik*,表示可以是 lik,like,likes

    • " :表示短语

    例子:

    --+ -
    SELECT
        * 
    FROM
        `fts_articles` 
    WHERE
        MATCH ( title, body ) AGAINST ( '+MySQL -YourSQL' IN BOOLEAN MODE );
    
    --no operator
    SELECT
        * 
    FROM
        `fts_articles` 
    WHERE
        MATCH ( title, body ) AGAINST ( 'MySQL IBM' IN BOOLEAN MODE );
    
    --@
    SELECT
        * 
    FROM
        `fts_articles` 
    WHERE
        MATCH ( title, body ) AGAINST ( '"DB2 IBM"@3' IN BOOLEAN MODE );
    
    
    --> <
    SELECT
        * 
    FROM
        `fts_articles` 
    WHERE
        MATCH ( title, body ) AGAINST ( '+MySQL +(>database <DBMS)' IN BOOLEAN MODE );
    
    --~
    
    SELECT
        * 
    FROM
        `fts_articles` 
    WHERE
        MATCH ( title, body ) AGAINST ( 'MySQL ~database' IN BOOLEAN MODE );
    
    --*
    SELECT
        * 
    FROM
        `fts_articles` 
    WHERE
        MATCH ( title, body ) AGAINST ( 'My*' IN BOOLEAN MODE );
    
    --"
    SELECT
        * 
    FROM
        `fts_articles` 
    WHERE
        MATCH ( title, body ) AGAINST ( '"MySQL Security"' IN BOOLEAN MODE );
    

    3、查询扩展搜索

    查询扩展相当于在自然语言索引的结果上,基于结果的关键字再进行一次查询。也就是说分成两个阶段:

    • 第一阶段:根据搜索的单词进行全文索引查询

    • 第二阶段:根据第一阶段产生的分词再进行一次全文检索的查询

    用法:

    SELECT column1, column2
    FROM table1
    WHERE MATCH(column1,column2)
          AGAINST('keyword',WITH QUERY EXPANSION);

    三、注意点

    1、自然语言全文索引创建索引时的字段需与查询的字段保持一致,即MATCH里的字段必须和FULLTEXT里的一模一样;

    2、自然语言检索时,检索的关键字在所有数据中不能超过50%(即常见词),则不会检索出结果。可以通过布尔检索查询;

    3、在mysql的stopword中的单词检索不出结果。可通过SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD查询所有的stopword。遇到这种情况,有两种解决办法:

    (1)stopword一般是mysql自建的,但可以通过设置ft_stopword_file变量为自定义文件,从而自己设置stopword,设置完成后需要重新创建索引。但不建议使用这种方法;

    (2)使用布尔索引查询。

    4、小于最短长度和大于最长长度的关键词无法查出结果。可以通过设置对应的变量来改变长度限制,修改后需要重新创建索引。

    myisam引擎下对应的变量名为ft_min_word_len和ft_max_word_len

    innodb引擎下对应的变量名为innodb_ft_min_token_size和innodb_ft_max_token_size

    5、MySQL 5.7.6 之前的版本不支持中文,需使用第三方插件

    6、全文索引只能在 InnoDB(MySQL 5.6以后) 或 MyISAM 的表上使用,并且只能用于创建 char,varchar,text 类型的列。

    展开全文
  • sql性能优化:sql Server 怎么添加全文索引+语法深度剖析+测试
  • oracle 全文检索 oracle全文索引 多列字段检索,匹配多列字段搜索功能。
  • MySQL全文索引

    千次阅读 2019-01-16 17:20:08
    最近在复习数据库索引部分,看到了 fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录。 引入 概念 通过数值比较、范围过滤等就可以完成绝大...
  • MySQL 之全文索引

    万次阅读 多人点赞 2018-04-14 15:47:56
    最近在复习数据库索引部分,看到了 fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录。 引入 概念 通过数值比较、范围过滤等就可以...
  • 一般现在的搜索引擎分为两部分,一部分是是分词,另外一部分是建立全文索引全文索引就是基于分词结果给没一个词都建立一个索引,我这里基于hash索引简单实现了一下全文索引
  • MySQL 之全文索引(fulltext)

    千次阅读 2021-08-27 09:37:09
    最近在复习数据库索引部分,看到了 fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录。 引入 概念 通过数值比较、范围过滤等就可以完成绝...
  • Oracle_全文索引
  • 从零开始学习MySQL全文索引

    千次阅读 2021-01-19 08:25:50
    一、为什么要用全文索引我们在用一个东西前,得知道为什么要用它,使用全文索引无非有以下原因like查询太慢、json字段查询太慢(车太慢了)没时间引入ElasticSearch、Solr或者Sphinx这样的软件,或者根本就不会用(无法...
  • 本文示范完整的SQL SERVER数据库全文索引以pubs数据库为例首先,介绍利用系统存储过程创建全文索引的具体步骤:1) 启动数据库的全文处理功能 (sp_fulltext_database)2) 建立全文目录 (sp_fulltext_catalog)3) 在...
  • MySQL索引系列:全文索引

    千次阅读 2020-11-07 16:34:12
    什么是全文索引全文索引首先是 MySQL 的一种索引类型,也是搜索引擎的关键技术。 试想在1M大小的文件中搜索一个词,可能需要几秒,在100M的文件中可能需要几十秒,如果在更大的文件中搜索那么就需要更大的系统...
  • Nebula Graph - 全文索引

    千次阅读 2022-05-22 11:40:56
    一、Nebula Graph - 全文索引 Nebula Graph 的全文索引,需要依靠于 Elasticsearch ,并且还存在着较多的限制,比如: 全文索引当前仅支持LOOKUP语句。 定长字符串长度超过 256 字节,将无法创建全文索引。 如果 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 141,690
精华内容 56,676
关键字:

全文索引