专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » mysql全文索引:MySQL全文搜索 »正文

mysql全文索引:MySQL全文搜索

来源: 发布时间:星期日, 2009年1月4日 浏览:71次 评论:0
="t18">全文索引在 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 (0.00 sec)MATCH对照个文本集(包含在个FULLTEXT索引中个或多个列列集)执行个自然语言搜索搜索串做为AGAINST参数被给定搜索以忽略字母大小写方式执行对于表中每个记录行MATCH返回个相关性值在搜索串和记录行在MATCH列表中指定文本的间相似性尺度

当MATCH被使用在个WHERE子句中时 (参看上面例子)返回记录行被自动地以相关性从高到底次序排序相关性值是非负浮点数字零相关性意味着不相似相关性计算是基于:词在记录行中数目、在行中唯数目、在集中词全部数目和包含个特殊词文档(记录行)数目

它也可以执行个逻辑模式搜索这在下面章节中被描述

前面例子是MATCH使用上些基本介绍说明记录行以相似性递减顺序返回

个举例显示如何检索个明确相似性值如果即没有WHERE也没有ORDER BY子句返回行是不排序

mysql> SELECT id,MATCH (title,body) AGAINST ('Tutorial') FROM articles;
+----+-----------------------------------------+
| id | MATCH (title,body) AGAINST ('Tutorial') |
+----+-----------------------------------------+
| 1 | 0.64840710366884 |
| 2 | 0 |
| 3 | 0.66266459031789 |
| 4 | 0 |
| 5 | 0 |
| 6 | 0 |
+----+-----------------------------------------+
6 rows in (0.00 sec)下面举例更复杂查询返回相似性并依然以相似度递减次序返回记录行为了完成这个结果你应该指定MATCH两次这不会引起附加开销 MySQL 优化器会注意到两次同样MATCH并只次全文搜索代码

mysql> SELECT id, body, MATCH (title,body) AGAINST
-> ('Security implications of running MySQL as root') AS score
-> FROM articles WHERE MATCH (title,body) AGAINST
-> ('Security implications of running MySQL as root');
+----+-------------------------------------+-----------------+
| id | body | score |
+----+-------------------------------------+-----------------+
| 4 | 1. Never run mysqld as root. 2. ... | 1.5055546709332 |
| 6 | When configured properly, MySQL ... | 1.31140957288 |
+----+-------------------------------------+-----------------+
2 rows in (0.00 sec)MySQL 使用个非常简单剖析器来将文本分隔成词个“词”是由文字、数据、“'”和“_”组成任何序列任何在 stopword 列表上出现或太短(3 个或更少) “word” 将被忽略

在集和查询中每个合适词根据其在集和查询中重要性衡量这样个出现在多个文档中词将有较低权重(可能甚至有个零权重)在这个特定集中它有较低语义值否则如果词是较少它将得到个较高权重然后权重将被结合用于计算记录行相似性

这样个技术工作可很好地工作和大集(实际上它会小心地和的谐调) 对于非常小词分类不足以充份地反应它们语义值有时这个模式可能产生奇怪结果

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL');
Empty (0.00 sec)在上面例子中搜索词MySQL却没有得到任何结果这个词在超过记录行中出现同样它被有效地处理为个 stopword (即个零语义值词)这是最理想行为 -- 个自然语言查询不应该从个 1GB 表中返回每个次行(second row)

匹配表中半记录行词很少可能找到相关文档实际上它可能会发现许多不相关文档我们都知道当我们在互联网上通过搜索引擎试图搜索某些东西时这会经常发生这个原因在这个特殊数据集中这样行被设置个低语义值

到 4.0.1 时MySQL 也可以使用IN BOOLEAN MODE修饰语来执行个逻辑全文搜索

mysql> SELECT * FROM articles WHERE MATCH (title,body)
-> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+----+------------------------------+-------------------------------------+
| id | title | body |
+----+------------------------------+-------------------------------------+
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
| 2 | How To Use MySQL Efficiently | After you went through a ... |
| 3 | Optimising MySQL | In this tutorial we will show ... |
| 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... |
| 6 | MySQL Security | When configured properly, MySQL ... |
+----+------------------------------+-------------------------------------+这个查询返回所有包含词MySQL记录行(注意: 50% 阈值没有使用)但是它没有包含词YourSQL注意个逻辑模式搜索不会自动地以相似值降序排序记录行你可以从上面结果出看得出来最高相似值(包含MySQL两次那个) 最列在最后而不是第个逻辑全文搜索即使在没有个FULLTEXT索引情况下也可以工作然而它慢些

逻辑全文搜索支持下面操作符:

+
个领头加号表示该词必须出现在每个返回记录行中

-
个领头减号表示该词必须不出现在每个返回记录行中

缺省 (当既没有加号也没有负号被指定时)词是随意但是包含它记录行将被排列地更高这个模仿没有IN BOOLEAN MODE修饰词MATCH ... AGAINST行为

< >
这两个操作符用于改变个词相似性值基值<操作符减少基值>操作符则增加它参看下面举例

( )
圆括号用于对子表达式中词分组

~
个领头否定号作用象个否定操作符引起行相似性基值为负它对标记个噪声词很有用个包含这样记录将被排列得低但是不会被完全排除这样可以使用-操作符

*
个星号是截断操作符不想其它操作符它应该被追加到个词后不加在前面

"
短语被包围在双引号"中只匹配包含这个短语(字面上就好像被键入)记录行
这里是些举例:

apple banana
找至少包含上面词中记录行
+apple +juice
... 两个词均在被包含
+apple macosh
... 包含词 “apple”但是如果同时包含 “macosh”排列将更高
+apple -macosh
... 包含 “apple” 但不包含 “macosh”
+apple +(>pie <strudel)
... 包含 “apple” 和 “pie”或者包含是 “apple” 和 “strudel” (以任何次序)但是 “apple pie” 排列得比 “apple strudel” 要高
apple*
... 包含 “apple”“apples”“applesauce” 和 “applet”
"some words"
... 可以包含 “some words of wisdom”但不是 “some noise words”
全文限制
MATCH所有参数必须是从来自于同张表同时必须是同个FULLTEXT索引中部分除非MATCH是IN BOOLEAN MODE

MATCH列列表必须确切地匹配表FULLTEXT索引中定义列列表除非MATCH是IN BOOLEAN MODE

AGAINST参数必须是个常量
微调 MySQL 全文搜索
不幸地全文搜索仍然只有很少用户可调参数虽然增加些在 TODO 上排列很高如果你有个 MySQL 源码发行你可以发挥对全文搜索更多控制

注意全文搜索为最佳搜索效果被仔细地调整了修改默认值行为在大多数情况下只会使搜索结果更糟不要修改 MySQL 源代码除非你知道你在做什么!

被索引最小长度由 MySQL 变量ft_min_word_len指定

stopword 列表可以从ft_stopword_file变量指定文件中读取

50% 阈值选择由所选择特殊衡量模式确定为了禁止它修改`myisam/ftdefs.h'文件中下面行:
# GWS_IN_USE GWS_PROB改为:
# GWS_IN_USE GWS_FREQ然后重新编译 MySQL在这种情况下不需要重建索引注意:使用了这个将严重地减少 MySQL 为MATCH提供足够相似性值能力如果你确实需要搜索这样公共词最好使用IN BOOLEAN MODE搜索代替它不遵守 50% 阈值

有时搜索引擎维护员希望更改使用于逻辑全文搜索操作符这些由变量ft_boolean_syntax定义对于这些更改要求你重建你FULLTEXT索引对于个 MyISAM 表最容易重建索引文件方式如下面语句:
mysql> REPAIR TABLE tbl_name QUICK;全文搜索 TODO
使所有对FULLTEXT索引操作更快
邻近(Proximity)操作符
对 "always-index words" 支持他们可以是用户希望视为个词处理任意例如 "C"、"AS/400"、"TCP/IP"等等
支持在MERGE表中全文搜索
对多字节支持
依照数据语言建立 stopword 列表
Stemming (当然依赖于数据语言)
Generic user-suppliable UDF preparser.
使模式更加灵活 (通过为CREATE/ALTER TABLE中FULLTEXT增加某些可调整参数)

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: