Mysql 简明教程

MySQL Boolean Full-Text Search

MySQL 提供了全文搜索功能,支持三种类型的搜索,其中一种是布尔全文搜索。

这个布尔全文搜索可以通过允许使用布尔运算符(例如 (+、-、>、<、* 等)和搜索字符串,对大量的文本数据执行复杂的搜索操作。

与搜索 concepts 的自然语言全文搜索不同,MySQL 中的布尔全文搜索将查找 specific words 。要执行此类搜索,需要在 AGAINST 表达式中包含 IN BOOLEAN MODE 修饰符。

Syntax

以下是使用 MySQL 中的 AGAINST 表达式结合 IN BOOLEAN MODE 修饰符执行布尔全文搜索的语法:

SELECT column_name(s) FROM table_name
WHERE MATCH(target_column_names)
AGAINST(expression IN BOOLEAN MODE);

其中,

  1. target_column_names 是我们想要在其中搜索关键字的列的名称。

  2. expression 是布尔运算符的关键词列表。

MySQL Boolean Full-Text Search Operators

下表指定了全文搜索布尔运算符 −

Example

首先,让我们使用以下查询创建一个名为 ARTICLES 的表 −

CREATE TABLE ARTICLES (
   ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
   ARTICLE_TITLE VARCHAR(100),
   DESCRIPTION TEXT,
   FULLTEXT (ARTICLE_TITLE, DESCRIPTION)
);

在上面的查询中,我们在列 ARTICLE_TITLEDESCRIPTION 上定义了全文索引。现在,让我们将值插入到上面创建的表中 −

INSERT INTO ARTICLES (ARTICLE_TITLE, DESCRIPTION) VALUES
('MySQL Tutorial', 'MySQL is a relational database system that uses SQL to structure data stored'),
('Java Tutorial', 'Java is an object-oriented and platform-independent programming languag'),
('Hadoop Tutorial', 'Hadoop is framework that is used to process large sets of data'),
('Big Data Tutorial', 'Big Data refers to data that has wider variety of data sets in larger numbers'),
('JDBC Tutorial', 'JDBC is a Java based technology used for database connectivity');

ARTICLES 表创建如下 −

现在,让我们执行布尔模式的全文搜索,我们正在搜索包含“数据”一词的行 −

SELECT * FROM ARTICLES
WHERE MATCH (ARTICLE_TITLE, DESCRIPTION)
AGAINST('data' IN BOOLEAN MODE);

Output

如我们从下面的输出中看到的那样,上面的查询返回了三行,其中包含“数据”一词 −

Example

在下面的查询中,我们正在搜索包含“数据”但不是“集合”的行 −

SELECT * FROM ARTICLES
WHERE MATCH(ARTICLE_TITLE, DESCRIPTION)
AGAINST('+data -sets' IN BOOLEAN MODE);

Output

以上查询的输出如下所示:

Example

在这里,我们正在搜索同时包含“数据”和“集合”这两个词的行 −

SELECT * FROM ARTICLES
WHERE MATCH(ARTICLE_TITLE, DESCRIPTION)
AGAINST('+data +sets' IN BOOLEAN MODE);

Output

执行给定的查询后,输出如下:

Example

在下面的查询中,我们正在搜索包含“集合”但不是“集合”的较高排名的那些行 −

SELECT * FROM ARTICLES
WHERE MATCH(ARTICLE_TITLE, DESCRIPTION)
AGAINST('+data sets' IN BOOLEAN MODE);

Output

当我们执行以上查询时,输出如下 −

Example

使用下面的查询,我们正在搜索包含“数据”一词的行,并在搜索中对包含“教程”一词的行进行较低排名 −

SELECT * FROM ARTICLES
WHERE MATCH(ARTICLE_TITLE, DESCRIPTION)
AGAINST('+data ~sets' IN BOOLEAN MODE);

Output

执行给定的查询后,输出如下:

Example

在这里,我们正在查找所有包含以“集合”开头的单词的行 −

SELECT * FROM ARTICLES
WHERE MATCH(ARTICLE_TITLE, DESCRIPTION)
AGAINST('set*' IN BOOLEAN MODE);

Output

执行给定的查询后,输出如下:

MySQL Boolean Full-Text Search Features

以下是 MySQL 布尔全文搜索的一些重要功能 −

  1. 在布尔全文搜索中,MySQL 不按相关性降序自动对行进行排序。

  2. InnoDB 表要求 MATCH 表达式的所有列都具有 FULLTEXT 索引才能执行布尔查询。

  3. 如果我们对 InnoDB 表的搜索查询提供多个布尔运算符,例如“++hello”,MySQL 不支持它们,并且会生成错误。但是,如果我们在 MyISAM 中执行相同的操作,它将忽略额外的运算符并使用最接近搜索词的运算符。

  4. 在 InnoDB 全文搜索中不支持尾随 (+) 或 (-) 符号。它仅支持前导 + 或 − 符号。

  5. 如果搜索词是“hello+”或“hello-”,MySQL 会生成错误。除此之外,以下内容也会生成错误“*”、“ - ”。

  6. 如果单词出现在超过 50% 的行中,MySQL 会在搜索结果中忽略该单词。这称为 50% 阈值。

Boolean Full-Text Search Using Client Program

使用客户端程序还可以对 MySQL 数据库执行布尔全文搜索操作。

Syntax

Example

以下是这些程序 −