自然语言模式(IN NATURAL LANGUAGE MODE)

Exisi 2023-03-18 10:14:02
Categories: Tags:
  • 自然语言模式将搜索字符串解释为文字短语。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。

 

  • 如果未指定修饰符或指定了 IN NATURAL LANGUAGE MODE 修饰符,则默认启用自然语言模式;

 

  • 默认情况下或使用 IN NATURAL LANGUAGE MODE 修饰符,MATCH() 函数针对文本集合执行自然语言搜索以查找字符串。集合是包含在 FULLTEXT 索引中的一组一个或多个列。搜索字符串作为 AGAINST() 的参数给出。

 

  • 对于表中的每一行,MATCH() 返回一个相关值;也就是说,搜索字符串与 MATCH() 列表中指定的列中该行中的文本之间的相似性度量。相关值是非负浮点数。零相关性意味着没有相似性。相关性是根据行(文档)中的单词数、行中唯一单词的数量、集合中的单词总数以及包含特定单词的行数来计算的。

示例

SELECT * FROM articles
WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE);

 

运行结果如下:

+----+-------------------------+----------------------------------------------+
| id
 | title                           | body                                                        |
+----+-------------------------+----------------------------------------------+
|  1
 | MySQL Tutorial         | DBMS stands for DataBase ...                 |
|  5
 | MySQL vs. YourSQL  | In the following database comparison ... |
+----+-------------------------+----------------------------------------------+
2 rows in set (0.00 sec)

示例

SELECT COUNT(*) FROM articles
WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE);

 

运行结果如下:

+-------------+
| COUNT(*) |
+-------------+
|      
        2 |
+-------------+
1 row in set (0.00 sec)

 

  • 以上查询做了一些额外的工作(按相关性对结果进行排序),但也可以使用基于 WHERE 子句的索引查找。如果搜索匹配的行很少,索引查找可能会使上述查询更快。

 

示例

SELECT

COUNT(

IF(

MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL

)

) AS count

FROM articles;

 

运行结果如下:

+--------+
| count
 |
+--------+
|     2
    |
+--------+
1 row in set (0.03 sec)

 

  • 此查询执行了全表扫描,如果搜索词出现在大多数行中,这可能比索引查找更快。

 

  • 默认情况下,搜索以不区分大小写的方式执行。要执行区分大小写的全文搜索,请对索引列使用区分大小写或二进制排序规则。例如,可以为使用 utf8mb4 字符集的列指定 utf8mb4_0900_as_cs utf8mb4_bin 的排序规则,以使其在全文搜索中区分大小写。

 

 

  • 当在 WHERE 子句中使用 MATCH() 时,如前面所示的示例中所示,只要满足以下条件,返回的行就会自动按照相关性最高的顺序排在第一位:
    • 不得有明确的 ORDER BY 子句。
    • 必须使用全文索引扫描而不是表扫描来执行搜索。
    • 如果查询连接表,全文索引扫描必须是连接中最左边的非常量表。

 

  • 给定刚才列出的条件,在需要或需要时使用 ORDER BY 指定显式排序顺序通常比较容易。

 

  • 对于自然语言全文搜索,在 MATCH() 函数中命名的列必须与表中某些 FULLTEXT 索引中包含的列相同。对于前面的查询,请注意 MATCH() 函数中命名的列(标题和正文)与文章表的 FULLTEXT 索引定义中命名的列相同。要单独搜索标题或正文,您需要为每一列创建单独的 FULLTEXT 索引

 

 

 

 

自然语言搜索的阈值

  • 对于搜索索引,50% 自然语言搜索的阈值由 选择的特定加权方案。要禁用它,请查找 以下行:MyISAMstorage/myisam/ftdefs.h

 

#define GWS_IN_USE GWS_PROB

将该行更改为:

 

#define GWS_IN_USE GWS_FREQ

 

  • 然后重新编译 MySQL

 

 

 

来自 <https://dev.mysql.com/doc/refman/8.0/en/fulltext-natural-language.html>