+ -
当前位置:首页 → 问答吧 → mysql 全文搜索

mysql 全文搜索

时间:2008-07-10

来源:互联网

今天在公司写这个网站的全文搜索的时候遇到了一些问题,开始的时候我是这样写的
  1. SELECT * FROM `article` WHERE ti like '%a%' or con like '%a%'
复制代码
这样是可以的,后来一个哥们告诉我这样多个like的话会出对服务器和数据库的压力比较大的,建议我用全文搜索吧。找了半天,找到这个文章,还不错的吧。 对于全站搜索,或者是一些大容量的搜索很有用的。ok,认真看吧。
到 MySQL3.23时,mysql 已经开始支持全文索引和搜索。全文索引在 mysql 中是一个 fulltext 类型索引。fulltext 索引用于 myisam 表,可以在 create table 时或之后使用 alter table 或 create index 在 char、varchar 或 text 列上创建。对于大的数据库,将数据装载到一个没有 fulltext 索引的表中,然后再使用 alter table (或 create index) 创建索引,这将是非常快的。将数据装载到一个已经有 fulltext 索引的表中,将是非常慢的。


全文搜索通过 match() 函数完成。
mysql> create table articles (

  ->  id int unsigned auto_increment not null primary key,

  ->  title varchar(200),

  ->  body text,

  ->  fulltext (title,body)

  -> );

query ok, 0 rows affected (0.00 sec)

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 ...');
query ok, 6 rows affected (0.00 sec)
records: 6 duplicates: 0 warnings: 0
mysql> select * from articles
  ->     where match (title,body) against ('database');

+----+-------------------------+-------------------------------------------------------+
| id  | title              | body                                 |
+----+-------------------------+-------------------------------------------------------+
| 5  | mysql vs. yoursql | in the following database comparison ... |
| 1  | mysql tutorial     | dbms stands for database ...           |
+----+-------------------------+-------------------------------------------------------+
2 rows in set (0.00 sec)[/pre]函数 match() 对照一个文本集(包含在一个 fulltext 索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为 against() 的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个记录行,match() 返回一个相关性值。即,在搜索字符串与记录行在 match() 列表中指定的列的文本之间的相似性尺度。
当 match() 被使用在一个 where 子句中时 (参看上面的例子),返回的记录行被自动地以相关性从高到底的次序排序。相关性值是非负的浮点数字。零相关性意味着不相似。相关性的计算是基于:词在记录行中的数目、在行中唯一词的数目、在集中词的全部数目和包含一个特殊词的文档(记录行)的数目。
它也可以执行一个逻辑模式的搜索。这在下面的章节中被描述。
前面的例子是函数 match() 使用上的一些基本说明。记录行以相似性递减的顺序返回。

作者: 乔峰   发布时间: 2008-07-10



[ 本帖最后由 falcon 于 2008-8-2 22:28 编辑 ]

作者: falcon   发布时间: 2008-08-02

小技巧,如果搜索的字符小于4个的时候,默认不会使用全文搜索,或者即使搜索也是搜索不出对应的结果,这点在手册里也是有介绍的。可以通过配置文件进行修改也可以通过后天在PHP里进行补上

作者: gouki   发布时间: 2008-08-03

dffffffffffffffffffffffffffffffffffffffff

作者: gejun   发布时间: 2009-11-19

过来混钱的

作者: gejun   发布时间: 2009-11-19

中文没有和空格怎么办咧?

作者: 小小月亮   发布时间: 2009-12-10

终于看到我想要的东西了

作者: zhangcw   发布时间: 2010-04-28

还是搞不懂全文索引呀

作者: job144022   发布时间: 2010-08-31