MySQL全文索引之自然语言全文索引、更改默认停用词

1、MySQL全文索引
MySQL中的全文索引是类型的索引 FULLTEXT。全文索引只能使用 InnoDB或 MyISAM表格,并且只能用于创建CHAR, VARCHAR或 TEXT列。

FULLTEXT索引可以在CREATE TABLE创建表时被定义,也可以稍后使用添加 ALTER TABLE或 CREATE INDEX添加。但对于大型数据集,将数据加载到没有FULLTEXT索引的表中,然后在此之后创建索引要快得多,而不是将数据加载到具有现有FULLTEXT索引的表中。

使用MATCH() … AGAINST语法执行全文搜索 。 MATCH()采用逗号分隔的列表来命名要搜索的列。 AGAINST获取要搜索的字符串,以及指示要执行的搜索类型的可选修饰符。搜索字符串必须是在查询评估期间保持不变的字符串值。

2、全文索引类型:

(1)自然语言全文索引
将搜索字符串解释为自然人类语言(自由文本中的短语)中的短语。没有特殊运算符,但双引号(“)字符除外。存在停用词列表。

如果给出IN NATURAL LANGUAGE MODE修饰符或者没有修饰符,则全文搜索是自然语言搜索 。

(2)布尔全文索引
使用特殊查询语言的规则来解释搜索字符串。该字符串包含要搜索的单词。它还可以包含指定要求的运算符,以便在匹配的行中必须存在或不存在单词,或者它应该比通常更高或更低的权重。搜索索引中省略了某些常用词(停用词),如果搜索字符串中存在,则不匹配。该IN BOOLEAN MODE修饰符指定一个布尔搜索。

(3)查询扩展全文索引
是自然语言搜索的修改。搜索字符串用于执行自然语言搜索。然后将搜索返回的最相关行中的单词添加到搜索字符串中,然后再次进行搜索。查询返回第二次搜索中的行。该IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION或WITH QUERY EXPANSION修改指定查询扩展搜索。

3、自然语言全文索引
默认情况,或着使用IN NATURAL LANGUAGE MODE修饰符, MATCH()函数会针对FULLTEXT索引中包含的一个或多个列的集合执行字符串的自然语言搜索 。搜索字符串作为参数给出AGAINST()。对于表中的每一行,MATCH()返回相关值; 也就是说,搜索字符串与MATCH()列表中指定的列中该行中的文本之间的相似性度量。

mysql> CREATE TABLE articles (
    -> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    -> title VARCHAR(200),
    -> body TEXT,
    -> FULLTEXT (title,body)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.46 sec)

mysql> INSERT INTO articles (title,body) VALUES
    -> ('MySQL Tutorial','DBMS stands for DataBase ...'),
    -> ('How To Use MySQL Well','After you went through a ...'),
    -> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    -> ('MySQL vs. YourSQL','In the following database comparison ...'),
    -> ('MySQL Security','When configured properly, MySQL ...');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

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)

mysql> SELECT * FROM articles
    -> WHERE MATCH (title,body)
    -> AGAINST ('database' IN NATURAL LANGUAGE MODE);		//不加修饰符时,像这样AGAINST ('DATABASE');为默认
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)

//默认情况下,搜索以不区分大小写的方式执行

对于自然语言全文搜索,MATCH()函数中指定的列必须与表中某些FULLTEXT索引中包含的列相同。像下面我们如果要单独搜索title或 body会报错,可以使用FULLTEXT为每列创建单独的索引。

mysql> SELECT * FROM articles WHERE MATCH (body) AGAINST ('DATABASE' IN NATURAL LANGUAGE MODE);
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list

当MATCH()在WHERE子句中使用时 ,如前面所示的示例中所示,返回的行将首先自动排序,具有最

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值