Rumah > pangkalan data > tutorial mysql > Apakah indeks teks penuh mysql

Apakah indeks teks penuh mysql

青灯夜游
Lepaskan: 2023-04-23 19:03:24
asal
3711 orang telah melayarinya

Dalam mysql, pengindeksan teks penuh ialah teknologi untuk mencari sebarang maklumat dalam keseluruhan buku atau keseluruhan artikel yang disimpan dalam pangkalan data. Kebanyakan pertanyaan yang kami perlukan boleh dilengkapkan melalui perbandingan berangka, penapisan julat, dsb. Walau bagaimanapun, jika anda ingin menapis pertanyaan melalui padanan kata kunci, anda memerlukan pertanyaan berdasarkan persamaan dan bukannya perbandingan angka yang tepat dan Teks Penuh pengindeksan direka untuk senario ini.

Apakah indeks teks penuh mysql

Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.

Pengenalan


konsep

Carian Teks Penuh ialah teknologi yang mencari sebarang maklumat dalam keseluruhan buku atau artikel yang disimpan dalam pangkalan data. Ia boleh mendapatkan maklumat tentang bab, bahagian, perenggan, ayat, perkataan, dsb. dalam teks penuh mengikut keperluan, dan juga boleh melakukan pelbagai statistik dan analisis. Pengindeksan teks penuh biasanya dilaksanakan melalui indeks terbalik.

Kebanyakan pertanyaan yang kami perlukan boleh dilengkapkan melalui perbandingan berangka, penapisan julat, dsb. Walau bagaimanapun, jika anda ingin menapis pertanyaan melalui padanan kata kunci, anda perlu membuat pertanyaan berdasarkan persamaan dan bukannya perbandingan berangka tepat asal . Pengindeksan teks penuh direka untuk senario ini.

Anda mungkin berkata, anda boleh menggunakan suka + % untuk mencapai padanan kabur, mengapa anda memerlukan pengindeksan teks penuh? like + % sesuai apabila teks agak kecil, tetapi ia tidak dapat dibayangkan untuk mendapatkan sejumlah besar data teks. Dalam menghadapi sejumlah besar data, pengindeksan teks penuh boleh menjadi N kali lebih pantas daripada seperti + %. Kelajuan bukanlah susunan magnitud, tetapi pengindeksan teks penuh mungkin mempunyai masalah ketepatan.

Anda mungkin tidak memberi perhatian kepada pengindeksan teks penuh, tetapi anda harus biasa dengan sekurang-kurangnya satu teknologi pengindeksan teks penuh: pelbagai enjin carian. Walaupun objek indeks enjin carian adalah jumlah data yang sangat besar, dan biasanya tidak ada pangkalan data hubungan di belakangnya, prinsip asas pengindeksan teks penuh adalah sama.

Sokongan versi

Sebelum kita bermula, mari kita bincangkan tentang versi indeks teks penuh, enjin storan dan sokongan jenis data

  1. Dalam versi sebelum MySQL 5.6, hanya enjin storan MyISAM yang menyokong pengindeksan teks penuh;
  2. Dalam versi MySQL 5.6 dan lebih baru, kedua-dua enjin storan MyISAM dan InnoDB menyokong pengindeksan teks penuh;
  3. Hanya medan Indeks teks penuh boleh dibina hanya jika jenis data ialah char, varchar, teks dan sirinya.

Apabila menguji atau menggunakan indeks teks penuh, anda mesti terlebih dahulu menyemak sama ada versi MySQL, enjin storan dan jenis data anda menyokong indeks teks penuh.

Pengendalian indeks teks penuh


Pengendalian indeks boleh dicari dengan mudah, tetapi saya akan mengulanginya di sini.

Buat

  1. Buat indeks teks penuh apabila mencipta jadual
create table fulltext_test (
    id int(11) NOT NULL AUTO_INCREMENT,
    content text NOT NULL,
    tag varchar(255),    PRIMARY KEY (id),
    FULLTEXT KEY content_tag_fulltext(content,tag)  // 创建联合全文索引列
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Salin selepas log masuk
  1. Buat indeks teks penuh pada jadual sedia ada
create fulltext index content_tag_fulltext    on fulltext_test(content,tag);
Salin selepas log masuk
  1. Buat indeks teks penuh melalui pernyataan SQL ALTER TABLE
alter table fulltext_test    add fulltext index content_tag_fulltext(content,tag);
Salin selepas log masuk

Ubah suai

Ubah suai dengan O, padamkannya dan bina semula secara langsung.

Padam

  1. Gunakan DROP INDEX terus untuk memadam indeks teks penuh
drop index content_tag_fulltext    on fulltext_test;
Salin selepas log masuk
  1. Padam indeks teks penuh melalui pernyataan SQL ALTER TABLE
alter table fulltext_test    drop index content_tag_fulltext;
Salin selepas log masuk

Gunakan indeks teks penuh


yang adalah berbeza daripada padanan kabur yang biasa digunakan seperti + %, teks penuh Indeks mempunyai format sintaksnya sendiri, menggunakan padanan dan melawan kata kunci, seperti

select * from fulltext_test 
    where match(content,tag) against('xxx xxx');
Salin selepas log masuk

Nota: Lajur yang dinyatakan dalam fungsi padanan() mestilah sama seperti yang dinyatakan dalam indeks teks penuh Lajur adalah sama, jika tidak, ralat akan dilaporkan dan indeks teks penuh tidak boleh digunakan Ini kerana indeks teks penuh tidak merekodkan lajur mana kata kunci itu berasal. Jika anda ingin menggunakan indeks teks penuh untuk lajur, buat indeks teks penuh yang berasingan untuk lajur itu.

Uji indeks teks penuh


Tambah data ujian

Ya Dengan pengetahuan di atas, anda boleh menguji indeks teks penuh.

Mula-mula buat jadual ujian dan masukkan data ujian

create table test (
    id int(11) unsigned not null auto_increment,
    content text not null,    primary key(id),
    fulltext key content_index(content)
) engine=MyISAM default charset=utf8;insert into test (content) values ('a'),('b'),('c');insert into test (content) values ('aa'),('bb'),('cc');insert into test (content) values ('aaa'),('bbb'),('ccc');insert into test (content) values ('aaaa'),('bbbb'),('cccc');
Salin selepas log masuk

Laksanakan pertanyaan berikut mengikut sintaks indeks teks penuh

select * from test where match(content) against('a');select * from test where match(content) against('aa');select * from test where match(content) against('aaa');
Salin selepas log masuk

Mengikut inersia kami berfikir, ia sepatutnya dipaparkan 4 rekod adalah betul, tetapi hasilnya ialah tiada 1 rekod Hanya apabila melaksanakan pertanyaan berikut

select * from test where match(content) against('aaaa');
Salin selepas log masuk

adakah 1 rekod aaaa akan menjadi. dijumpai.

Kenapa? Terdapat banyak sebab untuk masalah ini, yang paling biasa disebabkan oleh panjang carian minimum. Di samping itu, apabila menggunakan indeks teks penuh, mesti ada sekurang-kurangnya 4 rekod dalam jadual ujian, jika tidak, keputusan yang tidak dijangka akan berlaku.

Indeks teks penuh dalam MySQL mempunyai dua pembolehubah, panjang carian minimum dan panjang carian maksimum Perkataan yang panjangnya kurang daripada panjang carian minimum dan lebih besar daripada panjang carian maksimum tidak akan diindeks. Dalam istilah orang awam, jika anda ingin menggunakan carian indeks teks penuh untuk perkataan, panjang perkataan mestilah dalam julat dua pembolehubah di atas.

Nilai lalai kedua-dua ini boleh dilihat menggunakan arahan berikut

show variables like '%ft%';
Salin selepas log masuk

可以看到这两个变量在 MyISAM 和 InnoDB 两种存储引擎下的变量名和默认值

// MyISAM
ft_min_word_len = 4;
ft_max_word_len = 84;

// InnoDB
innodb_ft_min_token_size = 3;
innodb_ft_max_token_size = 84;
Salin selepas log masuk

可以看到最小搜索长度 MyISAM 引擎下默认是 4,InnoDB 引擎下是 3,也即,MySQL 的全文索引只会对长度大于等于 4 或者 3 的词语建立索引,而刚刚搜索的只有 aaaa 的长度大于等于 4。

配置最小搜索长度

全文索引的相关参数都无法进行动态修改,必须通过修改 MySQL 的配置文件来完成。修改最小搜索长度的值为 1,首先打开 MySQL 的配置文件 /etc/my.cnf,在 [mysqld] 的下面追加以下内容

[mysqld]innodb_ft_min_token_size = 1ft_min_word_len = 1
Salin selepas log masuk

然后重启 MySQL 服务器,并修复全文索引。注意,修改完参数以后,一定要修复下索引,不然参数不会生效。

两种修复方式,可以使用下面的命令修复

repair table test quick;
Salin selepas log masuk

或者直接删掉重新建立索引,再次执行上面的查询,a、aa、aaa 就都可以查出来了。

但是,这里还有一个问题,搜索关键字 a 时,为什么 aa、aaa、aaaa 没有出现结果中,讲这个问题之前,先说说两种全文索引。

两种全文索引


自然语言的全文索引

默认情况下,或者使用 in natural language mode 修饰符时,match() 函数对文本集合执行自然语言搜索,上面的例子都是自然语言的全文索引。

自然语言搜索引擎将计算每一个文档对象和查询的相关度。这里,相关度是基于匹配的关键词的个数,以及关键词在文档中出现的次数。在整个索引中出现次数越少的词语,匹配时的相关度就越高。相反,非常常见的单词将不会被搜索,如果一个词语的在超过 50% 的记录中都出现了,那么自然语言的搜索将不会搜索这类词语。上面提到的,测试表中必须有 4 条以上的记录,就是这个原因。

这个机制也比较好理解,比如说,一个数据表存储的是一篇篇的文章,文章中的常见词、语气词等等,出现的肯定比较多,搜索这些词语就没什么意义了,需要搜索的是那些文章中有特殊意义的词,这样才能把文章区分开。

布尔全文索引

在布尔搜索中,我们可以在查询中自定义某个被搜索的词语的相关性,当编写一个布尔搜索查询时,可以通过一些前缀修饰符来定制搜索。

MySQL 内置的修饰符,上面查询最小搜索长度时,搜索结果 ft_boolean_syntax 变量的值就是内置的修饰符,下面简单解释几个,更多修饰符的作用可以查手册

  • + 必须包含该词
  • - 必须不包含该词
  • > 提高该词的相关性,查询的结果靠前
  • < 降低该词的相关性,查询的结果靠后
  • (*)星号 通配符,只能接在词后面

对于上面提到的问题,可以使用布尔全文索引查询来解决,使用下面的命令,a、aa、aaa、aaaa 就都被查询出来了。

select * test where match(content) against(&#39;a*&#39; in boolean mode);
Salin selepas log masuk

总结


好了,差不多写完了,又到了总结的时候。

MySQL 的全文索引最开始仅支持英语,因为英语的词与词之间有空格,使用空格作为分词的分隔符是很方便的。亚洲文字,比如汉语、日语、汉语等,是没有空格的,这就造成了一定的限制。不过 MySQL 5.7.6 开始,引入了一个 ngram 全文分析器来解决这个问题,并且对 MyISAM 和 InnoDB 引擎都有效。

事实上,MyISAM 存储引擎对全文索引的支持有很多的限制,例如表级别锁对性能的影响、数据文件的崩溃、崩溃后的恢复等,这使得 MyISAM 的全文索引对于很多的应用场景并不适合。所以,多数情况下的建议是使用别的解决方案,例如 Sphinx、Lucene 等等第三方的插件,亦或是使用 InnoDB 存储引擎的全文索引。

几个注意点

  1. 使用全文索引前,搞清楚版本支持情况;
  2. 全文索引比 like + % 快 N 倍,但是可能存在精度问题;
  3. 如果需要全文索引的是大量数据,建议先添加数据,再创建索引;
  4. 对于中文,可以使用 MySQL 5.7.6 之后的版本,或者第三方插件。

【相关推荐:mysql视频教程

Atas ialah kandungan terperinci Apakah indeks teks penuh mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan