InnoDB全文索引

-- InnoDB全文索引

-- 建表
CREATE TABLE fts_a (
    FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL,
    body TEXT,
PRIMARY KEY(FTS_DOC_ID)
);

-- 插入数据
INSERT INTO fts_a
    SELECT NULL, 'Please poorridge in the pot';
INSERT INTO fts_a
    SELECT NULL, 'Please poorridge hot, pease porridge cold';
INSERT INTO fts_a
    SELECT NULL, 'Nine days old';
INSERT INTO fts_a
    SELECT NULL, 'Some like it hot, some like it cold';
INSERT INTO fts_a
    SELECT NULL, 'Some like it in the pot';
INSERT INTO fts_a
    SELECT NULL, 'Nine days old';
INSERT INTO fts_a
    SELECT NULL, 'I like code days';

-- 建立全文索引
CREATE FULLTEXT INDEX idx_fts ON fts_a(body);

-- 创建完成后观察表fts_a中数据
SELECT * FROM fts_a;

-- 通过设置参数innodb_ft_aux_table来查看分词对应的信息
SET GLOBAL innodb_ft_aux_table="mytest/fts_a";   

-- 查看分词对应的信息
SELECT * FROM information_schema.INNODB_FT_INDEX_TABLE;

-- 每个word都对应一个DOC_ID 和 POSITION, (7,7)第一个7代表了第7个文档的,第二个7代表在文档中的起始位置
-- 除此之外还有FIRST_DOC_ID, LAST_DOC_ID, DOC_COUNT 分别代表了该word第一次出现的文档ID,最后一次出现的文档ID,以及该word一共在多少个文档中存在。

-- 此时我们删除ID为7的文档
DELETE FROM mytest.fts_a WHERE FTS_DOC_ID=7;

-- 此时再次查看分词对应的信息,发现分词信息未发生变化
SELECT * FROM information_schema.INNODB_FT_INDEX_TABLE;

-- 这是因为InnoDB并不会直接删除索引中对应的记录,而是将删除的文档ID插入到DELETED表,因此我们进行如下查询:
SELECT * FROM information_schema.INNODB_FT_DELETED;

-- 可以看到删除的文档ID已经插入到了INNODB_FT_DELETED表中,这样看将来索引只会越来越多而不会减少,如果想要彻底删除倒排索引中该文档的分词信息,可以执行如下操作:

    -- 设置此参数为1,将仅进行倒排索引的操作,否则还会对Cardinality重新统计等其它操作
    SET GLOBAL innodb_optimize_fulltext_only=1;  

    -- 彻底删除索引
    OPTIMIZE TABLE mytest.fts_a;
    -- 此时第三次查看分词对应的信息,发现分词信息已经更新
    SELECT * FROM information_schema.INNODB_FT_INDEX_TABLE;
    -- 但是,INNODB_FT_DELETED中的记录仍在:
    SELECT * FROM information_schema.INNODB_FT_DELETED;
    -- 并且,会将彻底删除的文档ID记录到表INNNODB_FT_BEING_DELETED中。
    SELECT * FROM information_schema.INNODB_FT_BEING_DELETED;
    -- 并且不允许再次插入这个文档ID,否则数据库会异常 // Invalid InnoDB FTS Doc ID
    INSERT INTO fts_a
        SELECT 7, 'I like code days';
        
-- 还有一个概念,stopword列表,该列表中的word不需要进行索引分词操作。比如 the 这个单词没有实际意义,故不进行分词。
-- InnoDB有一张默认的stopword表,在information_schema架构下,表名为INNODB_FT_DEFAULT_STOPWORD, 默认共有36个stopword。
-- 你也可以通过参数innodb_ft_server_stopword_table来自定义stopword列表,如:
CREATE TABLE user_stopword(
    value VARCHAR(30)
)   ENGINE = INNODB;

SET GLOBAL innodb_ft_server_stopword_table="mytest/user_stopword";

-- 当前InnoDB的全文索引还存在以下限制:v5.6
-- 每张表只能有一个全文检索的索引
-- 由多列组合而成的全文检索的索引列必须使用相同的字符集与排序规则
-- 不支持没有单词界定符的语言,如中文、日语、韩语

猜你喜欢

转载自www.cnblogs.com/lz0925/p/12022889.html