MySQL全文本、布尔搜索

发布时间:2023年12月17日

一、全文本搜索

一般在创建表时启用全文本搜索。CREATE TABLE语句接受FULLTEXT子句,它给出被索引列的一个逗号分隔的列表。

CREATE TABLE names(
	name text NULL,
	FULLTEXT(name)
	);

这里的FULLTEXT索引单个列,如果需要也可以指定多个列。

在索引之后,使用两个函数Match()和Against()执行全文本搜索,其中Match()指定被搜索的列,Against()指定要使用的搜索表达式。

SELECT name
FROM names
WHERE MATCH(name) Against('sel');

Match(name)指示MySQL针对指定的列进行搜索,Against(‘sel’)指定词sel作为搜索文本。
传递给Match()的值必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们(而且次序正确)。如果查询只涉及一个列,那么这个列必须有自己的 FULLTEXT 索引,或者是唯一一个列在某个 FULLTEXT 索引中。

全文本搜索的一个重要部分就是对结果排序。具有较高等级的行先返回(因为这些行很可能是你真正想要的行)

查询扩展:
查询扩展用来设法放宽所返回的全文本搜索结果的范围。可以找到sel相关的记录,包括不含有sel的。

在使用查询扩展时,MySQL对数据和索引进行两遍扫描来完成搜索:
首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行;
其次,MySQL检查这些匹配行并选择所有有用的词(我们将会简要地解释MySQL如何断定什么有用,什么无用);
再次,MySQL再次进行全文本搜索,这次不仅使用原来的条件,而且还使用所有有用的词。
利用查询扩展,能找出可能相关的结果,即使它们并不精确包含所查找的词。

SELECT name
FROM names
WHERE MATCH(name) Against('sel' WITH QUERY EXPANSION);

这次返回了7行。第一行包含词sel,因此等级最高。第二行与anvils无关,但因为它包含第一行中的两个词(customer和recommend),所以也被检索出来。第3行也包含这两个相同的词,但它们在文本中的位置更靠后且分开得更远,因此也包含这一行,但等级为第三。第三行确实也没有涉及anvils(按它们的产品名)。正如所见,查询扩展极大地增加了返回的行数,但这样做也增加了你实际上并不想要的行的数目。

二、布尔文本搜索

没有全文索引也可以布尔搜索

以布尔方式,可以提供关于如下内容的细节:要匹配的词;要排斥的词(如果某行包含这个词,则不返回该行,即使它包含其他指定的词也是如此);排列提示(指定某些词比其他词更重要,更重要的词等级更高);表达式分组;另外一些内容。

SELECT name
FROM names
WHERE MATCH(name) Against('sel -df' IN BOOLEAN MODE);

匹配包含sel但不包含df的记录

布尔操作符:
+ 包含
- 排除
> 包含,而且增加等级值
< 包含,而且减少等级值
() 把词组成子表达式
~ 取消一个词的排序值
* 词尾的通配符
“” 定义一个短语

三、全文本索引的重要说明

在索引全文本数据时,短词被忽略且从索引中排除。短词定义为那些具有3个或3个以下字符的词(如果需要,这个数目可以更改)
许多词出现的频率很高,搜索它们没有用处(返回太多的结果)。因此,MySQL规定了一条50%规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。50%规则不用于IN BOOLEAN MODE
忽略词中的单引号。例如,don’t索引为dont。
如果表中的行数少于3行,则全文本搜索不返回结果(因为每个词或者不出现,或者至少出现在50%的行中)

文章来源:https://blog.csdn.net/qq_43814415/article/details/134945457
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。