例如,用户可以在MySQL中搜索“测试”、“测试”或“测试”。所有这些词都是相互关联的,因为“测试”这个基本词在所有这些词中都很常见。有什么方法可以得到这样的结果或功能吗?
发布于 2018-01-08 06:13:53
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);自然语言模式下的
您可以插入一些示例数据并开始测试。(最好将其添加到示例数据集中。)例如,我们将尝试搜索迈克尔·杰克逊:
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)https://stackoverflow.com/questions/48144890
复制相似问题