全部博文(2065)
分类: Mysql/postgreSQL
2010-06-04 13:15:54
mysql中的全文索引
时间:
全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT
列上创建。对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。
笔记:
1、 全文索引FULLTEXT适用于字符串类型的字段信息。
2、 如果有这种索引再做批量更新速度很慢
3、 只有MYISAM类型的表才支持FULLTEXT全文索引
全文搜索通过 MATCH()
函数完成。(要用到全文索引就必须要使用这个函数)
建表语句:
mysql> CREATE TABLE articles (
-> id INT UNSIGNED AUTO_INCREMENT NOT NULL
PRIMARY KEY,
-> title VARCHAR(200),
-> body TEXT,
-> FULLTEXT (title,body)
-> );
在这里面我们创建了一个全文索引。现在来看一下
mysql> INSERT INTO articles VALUES
-> (NULL,'MySQL Tutorial', 'DBMS stands for DataBase
...'),
-> (NULL,'How To Use MySQL Efficiently', 'After you went
through a ...'),
-> (NULL,'Optimising MySQL','In this tutorial we will
show ...'),
-> (NULL,'1001 MySQL Tricks','1. Never run mysqld as
root. 2. ...'),
-> (NULL,'MySQL vs. YourSQL', 'In the following database
comparison ...'),
-> (NULL,'MySQL Security', 'When configured properly,
MySQL ...');
现在来检索
SQL语句1:使用like实现模糊查询
SELECT * FROM art
WHERE body like '%database%';
SQL语句2:使用全文索引
SELECT * FROM art WHERE MATCH (title,body) AGAINST
('database');
函数 MATCH() 对照一个文本集(包含在一个 FULLTEXT 索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为 AGAINST() 的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个记录行,MATCH() 返回一个相关性值。即,在搜索字符串与记录行在 MATCH() 列表中指定的列的文本之间的相似性尺度。
笔记:match() 里面包含了一个或多个列集。它做的是一个自然语言搜索字符串。指定的字符串为AGAINST()
当 MATCH() 被使用在一个 WHERE 子句中时 (参看上面的例子),返回的记录行被自动地以相关性从高到底的次序排序。相关性值是非负的浮点数字。零相关性意味着不相似。相关性的计算是基于:词在记录 行中的数目、在行中唯一词的数目、在集中词的全部数目和包含一个特殊词的文档(记录行)的数目。
这种算法与like是不一样的。这是一种相关性的检索