MySQL全文索引布尔模式详解

2023-12-15 08:56:25

在MySQL数据库中,使用全文索引可以对文本内容进行高效的搜索操作。特别是在布尔全文搜索(Boolean Full-Text Searches)中,通过IN BOOLEAN MODE修饰符,可以对搜索字符串中特定字符在词汇的开始或结束位置赋予特殊含义。这些特殊字符充当运算符,指导搜索行为,使查询变得更加灵活。

查询示例

以下查询中,+-操作符分别表示一个词必须存在或不存在于结果集中:

SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);

此查询返回所有包含“MySQL”但不包含“YourSQL”的行。

布尔逻辑解释

MySQL的布尔全文搜索实现了所谓的隐式布尔逻辑(Implied Boolean Logic):

  • +代表AND
  • -代表NOT
  • [无操作符]代表OR

特点

  • 布尔全文搜索结果不会自动按照相关性降序排列。
  • InnoDB表需要在MATCH()表达式中所有列上有FULLTEXT索引才能执行布尔查询。而MyISAM搜索索引即使没有FULLTEXT索引也可以执行搜索,但速度会很慢。
  • FULLTEXT索引对最小和最大词长限制参数适用于内建FULLTEXT解析器和MeCab解析器插件创建的索引。
  • 使用ngram解析器创建的FULLTEXT索引不受最小和最大词长参数限制,由ngram_token_size选项定义。
  • 停止词列表适用,可通过InnoDB和MyISAM的相关设置控制。
  • InnoDB全文搜索不支持在单个搜索词上使用多个操作符,如'++apple'会引发语法错误。
  • InnoDB全文搜索仅支持加号或减号前缀,不支持后缀,例如支持'+apple'但不支持'apple+'。
  • InnoDB全文搜索不支持在布尔全文搜索中使用@符号。@符号保留给@distance接近性搜索操作符。

操作符

MySQL布尔全文搜索提供了一系列操作符,以便对搜索进行更精细的控制。以下是各个操作符的含义及其使用示例:

+(必须存在)

一个前置加号+指示紧跟其后的词必须在返回的每一行中出现。
示例:'+apple +juice'
此查询将查找包含“apple”和“juice”这两个词的所有行。

-(必须不存在)

一个前置减号-指示紧跟其后的词不能出现在任何返回的行中。
示例:'+apple -macintosh'
此查询将查找包含“apple”,但不包含“macintosh”的行。

(无操作符)(可选存在)

默认情况下,即既没有+也没有-时,表示该词的存在是可选的,但包含该词的行会被赋予更高的评分。
示例:'apple banana'
此查询查找至少包含“apple”或“banana”中一个词的所有行。

@distance(临近性)

此操作符仅用于InnoDB表,用来确定两个或多个词是否在指定的单词距离内起始。
示例:'"apple banana" @5'
意味着系统会在titlebody字段中匹配那些包含“apple”和“banana”这两个词的记录,且这两个词的起始点之间的距离(以词的数量衡量)不超过5个词的距离。换句话说,“apple”和“banana”要相互靠近,它们之间最多只能有其他4个词出现。

> <(相关性调整)

使用>和<可以增加或减少词对相关性值的贡献度。
示例:'+apple +(>turnover <strudel)'
此查询查找包含“apple”和“turnover”或“apple”和“strudel”的行,但给“apple turnover”比“apple strudel”更高的评分。

()(子表达式)

括号用来将词组合成子表达式,可以嵌套使用。
示例:'+(apple banana) +juice'
此查询查找包含“apple”或“banana”,并且含有“juice”的行。

~(否定操作符)

前置波浪号~作为否定操作符,它会使得紧跟其后的词对行的相关性产生负贡献。
示例:'+apple ~macintosh'
此查询查找包含“apple”的行,如果行同时包含“macintosh”则降低排名,而不是完全排除这些行。

*(通配符)

星号*作为截断(或通配符)操作符,它被追加到需要影响的词后面,以匹配任何以该词开头的词。
示例:'apple*'
此查询查找包含以“apple”开头的任何词的行,如“apple”, “apples”, “applesauce”, 或“applet”。

"(短语)

双引号用于将词组封闭成短语,只匹配完全包含该短语的行。
示例:'"some words"'
此查询查找包含精确短语“some words”的所有行,例如包含“some words of wisdom”,但不包含“some noise words”的行。

通过结合使用这些操作符,MySQL的布尔全文搜索提供了强大而灵活的检索功能,使得用户可以构建复杂且精确的搜索条件。

相关性排名(Relevancy Rankings)

InnoDB全文搜索的相关性排名基于Sphinx全文搜索引擎并且使用基于BM25和TF-IDF排名算法。相关性排名计算方式如下:

${IDF} = log10( ${total_records} / ${matching_records} )
${rank} = ${TF} * ${IDF} * ${IDF}

这种计算方式使得文档频率越低(即在少数文档中出现)且在某一文档中频率越高的词,其对文档相关性的贡献也越大。

在执行全文搜索时,如果一个词在文档中出现多次,那么它的IDF值会乘以TF值。对于多词全文搜索,相关性排名的值是每个词的相关性排名值之和。

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