【发布时间】:2018-06-17 02:42:27
【问题描述】:
在 MySQL 中提取词干 例如用户可能会搜索“testing”、“tested”或“tests”。所有这些词都是相互关联的,因为基本词“测试”在所有这些词中都很常见。 有没有办法得到这样的结果或功能?
【问题讨论】:
-
(1) 我删除了不相关的数据库标签。 (2) 词干提取不适用于关系型数据库。
标签: mysql sql mysql-workbench
在 MySQL 中提取词干 例如用户可能会搜索“testing”、“tested”或“tests”。所有这些词都是相互关联的,因为基本词“测试”在所有这些词中都很常见。 有没有办法得到这样的结果或功能?
【问题讨论】:
标签: mysql sql mysql-workbench
MySQL 全文搜索
过去,MyISAM 引擎支持全文搜索。在 5.6 版本之后,MySQL 还支持在 InnoDB 存储引擎中进行全文搜索。这是个好消息,因为它使开发人员能够从 InnoDB 的引用完整性、执行事务的能力和行级锁中受益。
MySQL 中的全文搜索基本上有两种方法:自然语言和布尔模式。 (第三个选项通过第二个扩展查询来增强自然语言搜索。)
自然模式和布尔模式之间的主要区别在于,布尔模式允许某些运算符作为搜索的一部分。例如,如果一个词在查询中比其他词具有更大的相关性,或者如果某个特定词应该出现在结果中等,则可以使用布尔运算符。值得注意的是,在这两种情况下,结果都可以通过计算的相关性进行排序MySQL 在搜索过程中。
最适合我们的问题是在布尔模式下使用 InnoDb 全文搜索。为什么?
在标准化 Vertabelo 模型中
让我们看看一个简单的搜索是如何工作的。我们将首先创建一个示例表:
CREATE TABLE artists (
id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL,bio text NOT NULL, CONSTRAINT artists_pk PRIMARY KEY (id)
)ENGINE InnoDB;
CREATE FULLTEXT INDEX artists_idx_1 ON artists (name);
在自然语言模式下
您可以插入一些示例数据并开始测试。 (最好将其添加到您的示例数据集中。)例如,我们将尝试搜索 Michael Jackson:
SELECT
*
FROM
artists
WHERE
MATCH (artists.name) AGAINST ('Michael Jackson' IN NATURAL LANGUAGE MODE)
此查询将查找与搜索词匹配的记录,并按相关性对匹配记录进行排序;匹配越好,它的相关性就越高,结果在列表中的显示就越高。 在布尔模式下
我们可以在布尔模式下执行相同的搜索。如果我们不对查询应用任何运算符,唯一的区别是结果不按相关性排序:
SELECT
*
FROM
artists
WHERE
MATCH (artists.name) AGAINST ('Michael Jackson' IN BOOLEAN MODE)
布尔模式下的通配符
由于我们要搜索词干和部分词,我们将需要通配符运算符 (*)。该运算符可用于布尔模式搜索,这就是我们选择该模式的原因。
所以,让我们释放布尔搜索的力量,尝试搜索艺术家姓名的一部分。我们将使用通配符运算符来匹配名称以“Mich”开头的任何艺术家:
SELECT
*
FROM
artists
WHERE
MATCH (name) AGAINST ('Mich*' IN BOOLEAN MODE)
【讨论】: