在 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 中的全文搜索前添加 *(星号)的主要内容,如果未能解决你的问题,请参考以下文章