在 MySQL 中的全文搜索前添加 *(星号)

Posted

技术标签:

【中文标题】在 MySQL 中的全文搜索前添加 *(星号)【英文标题】:Prepending an * (asterisk) to a Fulltext Search in MySQL 【发布时间】:2021-06-02 18:06:20 【问题描述】:

我知道星号是可以附加到全文搜索词末尾的通配符,但是如果我搜索的关键字是后缀怎么办?例如,我希望能够搜索“ames”并返回包含名称“james”的结果。这是我当前的查询,它不起作用,因为您不能在全文搜索前添加星号。

SELECT * FROM table WHERE MATCH(name, about, address) AGAINST ("*$key*" IN BOOLEAN MODE)

我会简单地切换到使用 LIKE,但对于我的数据库大小来说它太慢了。

【问题讨论】:

【参考方案1】:

由于 mysql 的限制,无法完成。值的索引是从左到右,而不是从右到左。如果您想在搜索字符串前添加通配符,则必须坚持使用 LIKE。

【讨论】:

【参考方案2】:

你可以做的是在你的数据库中创建另一个带有全文搜索索引的列,这个新列应该有你试图搜索的列的反转字符串,你将反转搜索查询并使用它来在反向列上搜索,查询将如下所示:

SELECT * FROM table WHERE MATCH(column1) AGAINST ("$key*" IN BOOLEAN MODE) OR MATCH(reversedColumn1) AGAINST ("$reveresedkey*" IN BOOLEAN MODE)

第一个条件 MATCH(column1) AGAINST ("$key*" IN BOOLEAN MODE) 例子: reversedColumn1==>Jmaes$reveresedkey*==>ames* 将搜索以 ames ==> 不匹配的单词开头的单词

秒条件 MATCH(reversedColumn1) AGAINST ("$reveresedkey*" IN BOOLEAN MODE) 例子: reversedColumn1==>semaJ$reveresedkey*==>sema* 将搜索以 ames 结尾的单词 ==> 我们有匹配项

如果你的文字很短,这可能不是一个坏主意:

【讨论】:

前导通配符不适用于全文搜索,奇怪的是没有实际的解决方案,我们必须坚持使用一些变通方法!我认为这是因为考虑性能。最后一句话是通配符 () 不能用作前缀。所以 foo 会起作用 foo 或 *foo 不会起作用。 @Bandar,如果两边都需要星号怎么办?

以上是关于在 MySQL 中的全文搜索前添加 *(星号)的主要内容,如果未能解决你的问题,请参考以下文章

mysql中的全文本搜索用在啥情况下?

InnoDB 错误中的 MySQL 全文搜索

忽略查询中的mysql全文停用词

全文搜索之MySQL与ElasticSearch搜索引擎

Django MySql全文搜索有效,但不适用于测试

mysql 全文模糊搜索MATCH AGAINST方法