mysql 全文搜索6_在MySQL 5.6 16.04上,如何通过全文搜索改进数据库搜索

介绍

全文搜索或FTS是搜索引擎用来在数据库中查找结果的技术,你可以用它来搜索网站,搜索引擎,报纸等网站上的搜索结果。

从技术上讲,数据库管理系统(DBMS )像MySQL通常允许使用LIKE子句进行部分文本查找,但是,这些请求在大型数据集上往往表现不佳。

使用FTS,你可以构建一个更强大的文本搜索引擎,而不需要对更高级的工具引入额外的依赖,在本教程中,你将使用MySQL 5.6来查询数据库,然后根据搜索输入的相关性对结果进行量化。

前提条件

在开始本教程之前,你需要:通过以下使用Ubuntu 16.04初始服务器设置指南设置的Ubuntu 16.04服务器,包括sudo非root用户和防火墙,按如何在Ubuntu 16.04上安装MySQL指南安装的MySQL 5.6或更高版本。

第1步创建测试数据

为了尝试全文搜索,我们需要一些数据,在这个步骤中,我们创建一个名为testdb的数据库,该表中包含一个名为news的表。

注意:如果你拥有自己的文本数据,你可以跳到步骤2,然后进行相应的替换。

首先,访问MySQL控制台,你将被提示输入安装MySQL时设置的root密码。mysql -u root -p

连接后,提示将更改为mysql> 。

接下来,创建一个叫testdb的新数据库,此数据库将包含测试数据。CREATE DATABASE testdb;

默认情况下切换到testdb数据库,因此不必指定要在其中创建或更新内容的数据库的名称。USE testdb;

接下来,在数据库中创建一个叫news的表,其中包含聚合器例子新闻文章的列。CREATE TABLE news (

id INT NOT NULL AUTO_INCREMENT,

title TEXT NOT NULL,

content TEXT NOT NULL,

author TEXT NOT NULL,

PRIMARY KEY (id)

);

让我们来看看这个命令做了什么:CREATE TABLE是一个创建表的SQL命令,类似于许多其他数据库,news是表的名称,title,content和author是有无限长度的文本列,NOT NULL是用于标记不能包含空值 (虽然它们可能包含空字符串)的列的声明。

现在向表格中添加一些例子数据。INSERT INTO news (id, title, content, author) VALUES

(1, 'Pacific Northwest high-speed rail line', 'Currently there are only a few options for traveling the 140 miles between Seattle and Vancouver and none of them are ideal.', 'Greg'),

(2, 'Hitting the beach was voted the best part of life in the region', 'Exploring tracks and trails was second most popular, followed by visiting the shops and then traveling to local parks.', 'Ethan'),

(3, 'Machine Learning from scratch', 'Bare bones implementations of some of the foundational models and algorithms.', 'Jo');

让我们来看看这个命令做了什么:INSERT插入数据,INTO指定应插入数据的位置,在本例中,它是news表,(id, title, content, author) VALUES 指定每个条目值的数据应存储的列,最后三行是我们添加到表中的三行数据,每个都包含一个新闻网站的例子文章,带有title,一些content和author的名字,

每个条目也有一个唯一的id entifier,它自动输入到数据库索引中,数据库索引是一种数据结构,它提高了数据检索操作的性能,

现在我们有了一些数据,我们可以开始编写查询来使用FTS搜索数据。

步骤2-创建FTS索引并使用FTS函数

为文本列建立索引,这样就可以使用FTS 。

为此,使用一个叫FULLTEXT的MySQL命令,这个命令告诉MySQL将我们想要搜索的所有字段都放入内部索引中。ALTER TABLE news ADD FULLTEXT (title, content, author);

通过合并所有文本列并对它进行清理(例如。删除标点符号并使大写字母大写,现在创建了该索引,它将被更改源表内容的SQL查询更新。

接下来,尝试使用函数MATCH()AGAINST()对"Seattle beach"执行全文搜索。SELECT * FROM news WHERE MATCH (title,content,author) AGAINST ('Seattle beach' IN NATURAL LANGUAGE MODE)G

命令的MATCH()部分指定使用FTS对哪些列进行索引; 它必须与用于创建索引的列列表匹配,AGAINST()部分指定要执行全文搜索的单词,在本例中为"Seattle beach"

IN NATURAL LANGUAGE MODE 表示搜索词直接从用户输入提供,不需要预先处理,默认情况下,MySQL假设是自然语言模式,因此不必明确指定它。

自然语言模式相比,词干是指引用词的词缀,仅存储root部分的一种有用技术,例如,单词"fits"和"fitted"在词干匹配中使用匹配词是相同的。

不幸的是,MySQL不支持词干,FTS仍然有用,因为它比LIKE子句还快,

命令的输出将如下所示:Output*************************** 1. row ***************************

id: 1

title: Pacific Northwest high-speed rail line

content: Currently there are only a few options for traveling the 140 miles between Seattle and Vancouver and none of them are ideal.

author: Greg

*************************** 2. row ***************************

id: 2

title: Hitting the beach was voted the best part of life in the region

content: Exploring tracks and trails was second most popular, followed by visiting the shops and then traveling to local parks.

author: Ethan

2 rows in set (0.00 sec)

所有条目都没有包含短语"Seattle beach",但是由于使用了全文搜索,我们仍然得到了两个结果: 第一行,只包含单词"seattle",第二行只包含单词"beach",你可以通过更改关键字来尝试其他搜索结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值