, MySQL可以执行布尔型全文搜索布尔模式
修饰符。使用此修饰符,某些字符在搜索字符串中单词的开头或结尾具有特殊含义。在下面的查询中,+
而且-
运算符指示一个单词必须分别存在或不存在,才能进行匹配。因此,该查询检索包含该单词的所有行”MySQL”但确实如此不包含单词”YourSQL”:
mysql> SELECT * FROM article WHERE MATCH(标题,正文)AGAINST ('+ mysql -YourSQL'在布尔模式);+----+-----------------------+-------------------------------------+ | id | |头衔的身体 | +----+-----------------------+-------------------------------------+ | 1 | | DBMS代表数据库MySQL教程……| | 2 |如何很好地使用MySQL |在你经历了一个…| | 3 |优化MySQL在本教程中,我们将展示…| | 4 | 1001 MySQL小技巧|不要以root用户运行mysqld。2 .……| | 6 | MySQL安全|当正确配置时,MySQL…| +----+-----------------------+-------------------------------------+
在实现这个特性时,MySQL使用了有时被称为隐含布尔逻辑,其中
+
代表和
-
代表不
[没有操作符)意味着
或
布尔全文搜索具有以下特征:
它们不会自动按照相关性递减的顺序对行进行排序。
InnoDB
表需要全文
的所有列上的索引匹配()
表达式执行布尔查询。的布尔查询MyISAM
搜索索引可以工作,即使没有全文
索引,尽管以这种方式执行的搜索会相当慢。最小和最大字长全文参数应用于
全文
使用内置的索引创建全文
解析器和MeCab解析器插件。innodb_ft_min_token_size
而且innodb_ft_max_token_size
用于InnoDB
搜索索引。ft_min_word_len
而且ft_max_word_len
用于MyISAM
搜索索引。最小和最大字长全文参数不适用于
全文
使用ngram解析器创建的索引。Ngram令牌大小由ngram_token_size
选择。由控制的停止词列表应用
innodb_ft_enable_stopword
,innodb_ft_server_stopword_table
,innodb_ft_user_stopword_table
为InnoDB
搜索索引,以及ft_stopword_file
为MyISAM
的人。InnoDB
全文搜索不支持对单个搜索词使用多个操作符,如下例所示:“+ +苹果”
.对单个搜索词使用多个运算符将返回标准输出的语法错误。MyISAM全文搜索成功地处理了相同的搜索,忽略除紧挨着搜索词的操作符以外的所有操作符。InnoDB
全文搜索只支持前导加减号。例如,InnoDB
支持' +苹果'
但不支持“苹果+”
.指定后面的加号或减号会导致InnoDB
报告语法错误。InnoDB
全文检索不支持使用前导加号和通配符(' + *’
),一个正负号组合(“+ -”
),或以正负号组合(“+ -苹果”
).这些无效的查询返回一个语法错误。InnoDB
的全文搜索不支持使用@
布尔型全文搜索中的符号。的@
符号保留给@distance
接近搜索操作。他们没有使用50%的阈值
MyISAM
搜索索引。
布尔型全文搜索功能支持以下操作符:
+
开头或结尾的加号表示这个单词必须出现在返回的每一行中。
InnoDB
只支持前导加号。-
前面或后面的负号表示这个词必须不出现在返回的任何行中。
InnoDB
只支持前导负号。注意:
-
运算符仅用于排除与其他搜索词匹配的行。因此,一个布尔模式搜索只包含前面的项-
返回一个空结果。它不会返回”除包含任何排除项的行以外的所有行。”(没有操作符)
默认情况下(当两者都不是
+
也不-
),则该单词是可选的,但是包含它的行被赋予更高的等级。这模仿的行为匹配()与()
没有布尔模式
修饰符。@
距离
这个运算符作用于
InnoDB
只表。它测试两个或多个单词之间的起始距离是否都在指定范围内,以单词为单位。属性前的双引号字符串中指定搜索词@
例如,距离
MATCH(col1) AGAINST('"word1 word2 word3" @8'在布尔模式)
> <
这两个操作符用于更改单词对赋给行的相关性值的贡献。的
>
算子增加贡献和<
算子使它减小。请参阅下面的示例。( )
括号将单词分组为子表达式。括号内的组可以嵌套。
~
前导波浪号充当否定操作符,导致单词对行相关性的贡献为负。这对于标记很有用”噪音”单词。包含该词的行的评级比其他行低,但不会完全排除
-
操作符。*
星号用作截断符(或通配符)。不像其他运营商,它是附加要被影响的词。如果以前面的单词开头,则匹配
*
操作符。如果使用截断运算符指定了一个单词,则不会从布尔查询中删除它,即使它太短或是一个停止词。一个词是否太短是由
innodb_ft_min_token_size
设置InnoDB
表或ft_min_word_len
为MyISAM
表。这些选项不适用于全文
使用ngram解析器的索引。通配符字被视为前缀,必须出现在一个或多个字的开头。如果最小单词长度为4,则搜索
' +
可以返回比搜索更少的行吗词
+ *’' +
,因为第二个查询忽略了太短的搜索项词
+ '的
."
用双引号括起来的短语(
"
)字符只匹配包含短语的行字面上,就像打字一样.全文引擎将短语拆分为单词,并在全文
索引的词。非单词字符不需要精确匹配:短语搜索只需要匹配包含与短语完全相同的单词并且顺序相同。例如,“测试“
匹配“测试,“
.如果短语不包含索引中的单词,则结果为空。由于多种因素的组合,这些词可能不在索引中:如果它们在文本中不存在,是停止词,或者比索引词的最小长度短。
下面的例子演示了一些使用布尔全文操作符的搜索字符串:
“香蕉苹果”
找出至少包含这两个单词中的一个的行。
“+苹果+果汁”
找到包含这两个单词的行。
' +苹果麦金塔电脑的
找到包含单词的行”苹果”,但如果它们也含有”麦金塔电脑”.
' +苹果麦金托什
找到包含单词的行”苹果”但不是”麦金塔电脑”.
“+苹果macintosh ~”
找到包含单词的行”苹果”,但如果行中也包含该单词”麦金塔电脑”,它的评分低于如果行没有。这是”软”而不是去寻找
' +苹果麦金托什
的存在”麦金塔电脑”导致该行根本不返回。'+apple +(>turnover
找到包含这些单词的行”苹果”而且”营业额”,或”苹果”而且”点心”(在任何顺序),但等级”苹果公司的营业额”高于”苹果馅饼”.
“苹果”
查找包含以下单词的行”苹果”,”苹果”,”苹果酱”,或”小应用程序”.
“有些字”的
找到包含确切短语的行”一些单词”(例如,包含”智慧之语”但不是”一些噪音词”).注意
"
包含短语的字符是分隔短语的运算符字符。它们不是包含搜索字符串本身的引号。
InnoDB
全文搜索是基于斯芬克斯全文搜索引擎,所使用的算法都是基于BM25而且TF-IDF排名算法。由于这些原因,相关性排名InnoDB
布尔型全文搜索可能不同于MyISAM
相关性排名。
InnoDB
的变体”术语频率-逆文档频率”(TF-IDF
)加权系统,对给定全文检索查询的文件相关性进行排序。的TF-IDF
加权是基于一个单词在文档中出现的频率,与该单词在集合中所有文档中出现的频率相抵消。换句话说,单词在文档中出现的频率越高,单词在文档集合中出现的频率越低,文档的排名就越高。
如何计算相关性排名
频率一词(特遣部队
value是一个单词在文档中出现的次数。逆文档频率(以色列国防军
),用以下公式计算单词的值,其中total_records
是集合中的记录数量,和matching_records
是搜索词出现在记录中的数量。
${IDF} = log10(${total_records} / ${matching_records})
当一个文档多次包含一个单词时,IDF值乘以TF值:
${tf} * ${idf}
使用特遣部队
而且以色列国防军
值时,文档的相关性排名使用以下公式计算:
${rank} = ${TF} * ${IDF} * ${IDF}
下面的例子演示了这个公式。
单个词搜索的相关性排名
这个例子演示了单个单词搜索的相关性排名计算。
mysql> CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body)) ENGINE=InnoDB;查询OK, 0 rows affected(1.04秒)mysql> INSERT INTO articles (title,body) VALUES (' mysql教程','这个数据库教程…'),("如何使用mysql ",'在你经历了一个…'),('优化你的数据库','在这个数据库教程…'),(' mysql vs. YourSQL','当比较数据库时…'),(' mysql安全','正确配置时,mysql…'),('数据库,数据库,数据库','数据库数据库数据库'),('1001个mysql技巧','1. mysql ')。不要以root用户运行mysqld。2. ...'), ('MySQL全文索引','MySQL全文索引使用一个..');查询OK, 8行影响(0.06秒)记录:8重复:0警告:0 mysql> SELECT id, title,body, MATCH (title,body) AGAINST ('database' IN BOOLEAN MODE) AS score FROM articles ORDER BY score DESC;+----+------------------------------+-------------------------------------+---------------------+ | id身体标题| | |得分 | +----+------------------------------+-------------------------------------+---------------------+ | 6 |数据库,数据库,数据库|数据库数据库数据库| 1.0886961221694946 | | 3 |优化您的数据库|在这个数据库教程…| 0.36289870738983154 | | 1 | MySQL教程|这个数据库教程…| 0.18144935369491577 | | 2 |如何使用MySQL |在你经历了一个…| 0 | | 4 | MySQL vs. YourSQL |比较数据库时…| 0 | | 5 | MySQL安全|当正确配置时,MySQL… | 0 | | 7 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... | 0 | | 8 | MySQL Full-Text Indexes | MySQL fulltext indexes use a .. | 0 | +----+------------------------------+-------------------------------------+---------------------+ 8 rows in set (0.00 sec)
总共有8条记录,其中3条与”数据库”搜索词。第一张唱片(id 6
)出现6次,相关度排名为1.0886961221694946
.该排名值是使用特遣部队
值为6”数据库”搜索词在记录中出现6次id 6
)及以色列国防军
0.42596873216370745的值,计算方法如下(其中8为记录总数,3为搜索词出现的记录数):
${IDF} = log10(8 / 3) = 0.42596873216370745
的特遣部队
而且以色列国防军
值然后输入到排名公式:
${rank} = ${TF} * ${IDF} * ${IDF}
在MySQL命令行客户端中执行计算将返回一个排名值1.088696164686938。
mysql> SELECT 6*log10(8/3)*log10(8/3);+-------------------------+ | 6 * log10 (8/3) * log10 (8/3 ) | +-------------------------+ | 1.088696164686938 | +-------------------------+ 1行集(0.00秒)
方法返回的排序值可能略有不同选择……比赛……反对
语句和MySQL命令行客户端(1.0886961221694946
与1.088696164686938
).这种差异是由于整数和浮点/双精度浮点之间的强制类型转换在内部是由InnoDB
(以及相关的精度和舍入决定),以及它们在其他地方是如何执行的,比如在MySQL命令行客户端或其他类型的计算器中。
多词搜索的相关性排名
该示例演示了基于的多词全文搜索的相关度排序计算文章
表和前一个示例中使用的数据。
如果你搜索了多个单词,相关度排名值是每个单词相关度排名值的和,如下式所示:
${排名}= $ {TF} * $ {IDF} * $ {IDF} + $ {TF} * $ {IDF} * $ {IDF}
执行搜索两个术语('mysql tutorial')返回以下结果:
mysql> SELECT id, title,body, MATCH (title,body) AGAINST ('mysql tutorial' IN BOOLEAN MODE) AS score FROM articles ORDER BY score DESC;+----+------------------------------+-------------------------------------+----------------------+ | id身体标题| | |得分 | +----+------------------------------+-------------------------------------+----------------------+ | 1 | |这个数据库MySQL教程教程……| 0.7405621409416199 | | 3 |优化数据库|在这个数据库教程中…| 0.3624762296676636 | | 5 | MySQL安全|如果配置正确,MySQL…| 0.031219376251101494 | | 8 | MySQL全文索引| MySQL全文索引使用a ..| 0.031219376251101494 | | 2 |如何使用MySQL |当你经历了一个…| 0.015609688125550747 | | 4 | MySQL vs. YourSQL || 0.015609688125550747 | | 7 | 1001 MySQL小窍门|不要以root用户运行mysqld。2 .…… | 0.015609688125550747 | | 6 | Database, Database, Database | database database database | 0 | +----+------------------------------+-------------------------------------+----------------------+ 8 rows in set (0.00 sec)
在第一张唱片中(id 8
),“mysql”出现一次,“tutorial”出现两次。'mysql'有6条匹配记录,'tutorial'有2条匹配记录。MySQL命令行客户端在将这些值插入到多词搜索的排名公式时返回预期的排名值:
mysql >选择(1 * log10 (8/6) * log10 (8/6)) + (2 * log10 (8/2) * log10 (8/2));+-------------------------------------------------------+ | ( 1 * log10 (8/6) * log10 (8/6)) + (2 * log10 (8/2) * log10 (8/2 )) | +-------------------------------------------------------+ | 0.7405621541938003 | +-------------------------------------------------------+ 1行集(0.00秒)
方法返回的排序值之间的微小差异选择……比赛……反对
语句和MySQL命令行客户端在前面的例子中解释。