在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[无操作符]
代表ORngram_token_size
选项定义。MySQL布尔全文搜索提供了一系列操作符,以便对搜索进行更精细的控制。以下是各个操作符的含义及其使用示例:
一个前置加号+指示紧跟其后的词必须在返回的每一行中出现。
示例:'+apple +juice'
此查询将查找包含“apple”和“juice”这两个词的所有行。
一个前置减号-指示紧跟其后的词不能出现在任何返回的行中。
示例:'+apple -macintosh'
此查询将查找包含“apple”,但不包含“macintosh”的行。
默认情况下,即既没有+也没有-时,表示该词的存在是可选的,但包含该词的行会被赋予更高的评分。
示例:'apple banana'
此查询查找至少包含“apple”或“banana”中一个词的所有行。
此操作符仅用于InnoDB表,用来确定两个或多个词是否在指定的单词距离内起始。
示例:'"apple banana" @5'
意味着系统会在title
和body
字段中匹配那些包含“apple”和“banana”这两个词的记录,且这两个词的起始点之间的距离(以词的数量衡量)不超过5个词的距离。换句话说,“apple”和“banana”要相互靠近,它们之间最多只能有其他4个词出现。
使用>和<可以增加或减少词对相关性值的贡献度。
示例:'+apple +(>turnover
括号用来将词组合成子表达式,可以嵌套使用。
示例:'+(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值。对于多词全文搜索,相关性排名的值是每个词的相关性排名值之和。