# 布尔全文搜索

在本教程中，您将学习如何执行MySQL布尔全文搜索。 此外，您将学习如何使用布尔运算符来组成非常复杂的搜索查询。

## MySQL简介全文检索

除了[自然语言全文搜索](http://www.yiibai.com/mysql/natural-language-search.html)，MySQL还支持一种叫作*布尔全文搜索*的全文搜索的附加形式。在布尔模式中，MySQL搜索词而不是自然语言搜索中的概念。

MySQL允许您根据布尔模式下的非常复杂的查询以及布尔运算符执行全文搜索。这就是为什么布尔模式的全文搜索适合有经验的用户。

要在布尔模式下执行全文搜索，您可以在`AGAINST`表达式中使用`IN BOOLEAN MODE`修饰符。 以下示例说明如何搜索产品名称中包含单词`Truck`的产品。

```sql
SELECT productName, productline
FROM products
WHERE MATCH(productName) 
      AGAINST('Truck' IN BOOLEAN MODE )
```

执行上面查询语句，得到以下结果 -

```sql
mysql> SELECT productName, productline
FROM products
WHERE MATCH(productName) 
      AGAINST('Truck' IN BOOLEAN MODE );
+------------------------+------------------+
| productName            | productline      |
+------------------------+------------------+
| 1940 Ford Pickup Truck | Trucks and Buses |
| 1940s Ford truck       | Trucks and Buses |
+------------------------+------------------+
2 rows in set
```

返回产品名称包含`Truck`的两个产品。

要查找产品名称包含单词`Truck`但不包含`Pickup`的行的产品，可以使用排除布尔运算符( `-` )，该运算符返回不包括`Pickup`关键字的结果，如以下查询：

```sql
SELECT productName, productline
FROM products
WHERE MATCH(productName) AGAINST('Truck -Pickup' IN BOOLEAN MODE );
```

执行上面查询语句，得到以下结果 -

```sql
mysql> SELECT productName, productline
FROM products
WHERE MATCH(productName) AGAINST('Truck -Pickup' IN BOOLEAN MODE );
+------------------+------------------+
| productName      | productline      |
+------------------+------------------+
| 1940s Ford truck | Trucks and Buses |
+------------------+------------------+
1 row in set
```

## MySQL布尔全文搜索运算符

下表说明了全文搜索布尔运算符及其含义：

| 操作符  | 描述                              |
| ---- | ------------------------------- |
| `+`  | 包括，这个词必须存在。                     |
| `-`  | 排除，这个词不能存在。                     |
| `>`  | 包括并增加排名值。                       |
| `<`  | 包括并降低排名值。                       |
| `()` | 将单词分组成子表达式(允许将其包括，排除，排序等作为一个组)。 |
| `~`  | 否定一个词的排名值。                      |
| `*`  | 通配符，在结尾的单词                      |
| `“”` | 定义一个短语(与单个单词列表相反，整个短语匹配包含或排除)。  |

以下示例说明如何在搜索查询中使用布尔全文运算符：

要搜索包含两个词中至少一个词的行：`mysql`或`tutorial`，可使用：`mysql tutorial`； 要搜索包含两个单词的行：`mysql`或`tutorial`，可使用：`+mysql +tutorial`； 要搜索包含单词“`mysql`”的行，但为含有“`tutorial`”的行排列较高的排名：可使用：`+mysql tutorial`； 要搜索包含单词“`mysql`”而不是“`tutorial`”的行，可使用：`+mysql -tutorial`； 要搜索包含单词“`mysql`”的行，如果包含单词“`tutorial`”，则将行排列，可使用：`+mysql ~tutorial` 要搜索包含单词“`mysql`”和“`tutorial`”，或“`mysql`”和“`training`”的行以任何顺序排列，但将包含“`mysql tutorial`”的行高于“`mysql training`”。可使用：`+mysql +(>tutorial <training)`

要查找包含以“`my`”开头的单词的行，例如“`mysql`”，“`myspace`”等，请使用以下命令：`my*`。

## MySQL布尔全文搜索主要功能

* MySQL不按照布尔全文搜索中相关性降低的顺序自动排序行。
* 要执行布尔查询，*InnoDB*表需要*MATCH*表达式的所有列具有`FULLTEXT`索引。 请注意，*MyISAM*表不需要这个，尽管搜索速度相当慢。
* MySQL在*InnoDB*表上的搜索查询上不支持多个布尔运算符，例如`++mysql`。 如果这样做，MySQL将返回错误。 但是，*MyISAM*的行为方式不一样。它忽略其他运算符并使用最接近搜索词的运算符，例&#x5982;*+ -mysql*将成为`-mysql`。
* InnoDB全文搜索不支持尾部加号(`+`)或减号(`-`)号。 它只支持前加号或减号。 如果搜索字是`mysql+`或`mysql-`，MySQL将会报错。 另外，以下带有通配符的正加号或负号无效：`+*`，`+-`
* 不适用`50％`阈值。顺便说一下，`50％`阈值意味着如果一个词出现在超过`50％`的行中，MySQL将在搜索结果中忽略它。

在本教程中，我们向您展示了如何使用许多有用的布尔运算符执行MySQL布尔全文搜索。
