看到了一个php片段:
$input = new input();
$subject = isset($_POST) ? $input->post(‘subject’) : ”;
$sql = “SELECT * FROM mj_faq WHERE match(subject) against(‘{$subject}’)”;
这里有一个mysql全文搜索match+aganist
下面是我搜索到的资料:
全文的限制
MATCH() 函数的所有参数必须是从来自于同一张表的列,同时必须是同一个FULLTEXT 索引中的一部分,除非 MATCH() 是 IN BOOLEAN MODE 的。
MATCH() 列列表必须确切地匹配表的某一 FULLTEXT 索引中定义的列列表,除非 MATCH() 是 IN BOOLEAN MODE 的。
AGAINST() 的参数必须是一个常量字符串。
- 创建了, Key_name名字叫做 title , 它的字段列名Column_name是 title 和 body
- =================
- 下面为 表 添加数据内容, 好让我们进行测试。
- INSERT INTO articles (title,body) VALUES
- (‘MySQL Tutorial’,’DBMS stands for DataBase …’),
- (‘How To Use MySQL Well’,’After you went through a …’),
- (‘Optimizing MySQL’,’In this tutorial we will show …’),
- (‘1001 MySQL Tricks’,’1. Never run mysqld as root. 2. …’),
- (‘MySQL vs. YourSQL’,’In the following database comparison …’),
- (‘MySQL Security’,’When configured properly, MySQL …’);
- mysql> select * from articles;
- +—-+———————–+——————————————+
- | id | title | body |
- +—-+———————–+——————————————+
- | 1 | MySQL Tutorial | DBMS stands for DataBase … |
- | 2 | How To Use MySQL Well | After you went through a … |
- | 3 | Optimizing MySQL | In this tutorial we will show … |
- | 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. … |
- | 5 | MySQL vs. YourSQL | In the following database comparison … |
- | 6 | MySQL Security | When configured properly, MySQL … |
- +—-+———————–+——————————————+
- 6 rows in set (0.00 sec)
- 添加好数据库, 下面我们就使用 全文搜索 提供的 查询语句 进行测试。
- =================================================
- 使用语句的模版如下:
- SELECT 表字段 FROM 表名 WHERE MATCH (全文搜索表字段) AGAINST (‘搜索字符串’);
- 下面 搜索 title 和 body 包含 database 这个字符串
- 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)
- MATCH 相当于要找的列, 而 AGAINST 就是要找的内容。
- 比起 like 有点不一样
- 而且 match … against 还提供很多 操作, 对数据 进一步过滤,
- 一般可以作为 比较精确的搜索,
- 例如下面的这个例子: 搜索title和body中包含 MySQL ,但是不能有 YourSQL 的结果。
- SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST (‘+MySQL -YourSQL’ IN BOOLEAN MODE);
- ——————
- | 5 | MySQL vs. YourSQL | In the following database comparison … |
- 你会发现 可以看到 这个结果被过滤掉了
- fulltext 还提供了 更加多的逻辑搜索,也就是一些 模糊搜索 等等,要求更加高的
- 匹配字符搜索, 大家可以上 mysql 官方网站查看。
- =============================================================
另:
在SELECT的WHERE字句中用MATCH函数,索引的关键词用AGAINST标识,IN BOOLEAN MODE是只有含有关键字就行,不用在乎位置,是不是起启位置.
SELECT * FROM articles WHERE MATCH (tags) AGAINST (‘旅游’ IN BOOLEAN MODE);
逻辑全文搜索支持下面的操作符:
+
一个领头的加号表示,该词必须出现在每个返回的记录行中。
–
一个领头的减号表示,该词必须不出现在每个返回的记录行中。
缺省的 (当既没有加号也没有负号被指定时)词是随意的,但是包含它的记录行将被排列地更高一点。这个模仿没有 IN BOOLEAN MODE 修饰词的 MATCH() … AGAINST() 的行为。
< >
这两个操作符用于改变一个词的相似性值的基值。< 操作符减少基值,> 操作符则增加它。参看下面的示例。
( )
圆括号用于对子表达式中的词分组。
~
一个领头的否定号的作用象一个否定操作符,引起行相似性的词的基值为负的。它对标记一个噪声词很有用。一个包含这样的词的记录将被排列得低一点,但是不会被完全的排除,因为这样可以使用 – 操作符。
*
一个星号是截断操作符。不想其它的操作符,它应该被追加到一个词后,不加在前面。
”
短语,被包围在双引号”中,只匹配包含这个短语(字面上的,就好像被键入的)的记录行。
这里是一些示例:
apple banana
找至少包含上面词中的一个的记录行
+apple +juice
… 两个词均在被包含
+apple macintosh
… 包含词 “apple”,但是如果同时包含 “macintosh”,它的排列将更高一些
+apple -macintosh
… 包含 “apple” 但不包含 “macintosh”
+apple +(>pie
6.8.3 全文搜索 TODO
使所有对 FULLTEXT 索引的操作更快
邻近(Proximity)操作符
对 “always-index words” 的支持。他们可以是用户希望视为一个词处理的任意字符串,例如 “C++”、”AS/400″、”TCP/IP”,等等
支持在 MERGE 表中的全文搜索
对多字节字符的支持
依照数据的语言建立 stopword 列表
Stemming (当然,依赖于数据的语言)
Generic user-suppliable UDF preparser.
使模式更加灵活 (通过为 CREATE/ALTER TABLE 中的 FULLTEXT 增加某些可调整参数)