在MySQL中,在全文搜索前加上*(星号)

在MySQL中,在全文搜索前加上*(星号),mysql,database,full-text-search,boolean,match-against,Mysql,Database,Full Text Search,Boolean,Match Against,我知道星号是一个通配符,可以附加到全文搜索词的末尾,但是如果我搜索的关键字是后缀呢?例如,我希望能够搜索“ames”,并返回一个包含名称“james”的结果。这是我当前的查询,它不起作用,因为您不能在全文搜索前加上星号 SELECT * FROM table WHERE MATCH(name, about, address) AGAINST ("*$key*" IN BOOLEAN MODE) 我会简单地切换到使用LIKE,但对于我的数据库大小来说,这太慢了。由于MySQL的限制,无法完成。值

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

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

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

由于MySQL的限制,无法完成。值从左到右索引,而不是从右到左索引。如果您希望在搜索字符串之前添加通配符,则必须坚持这样做。

您可以在数据库中创建另一列,并使用全文搜索索引,此新列应具有您尝试搜索的列的反转字符串,您将反转搜索查询并使用它在反转列上搜索,以下是查询的外观:

SELECT * FROM table WHERE MATCH(column1) AGAINST ("$key*" IN BOOLEAN MODE) OR MATCH(reversedColumn1) AGAINST ("$reveresedkey*" IN BOOLEAN MODE)
  • 第一个条件
    将(第1列)与布尔模式下的($key*”匹配)
    例子:
    reversedColumn1==>Jmaes
    $reversedkey*=>ames*
    将搜索以ames==>不匹配开头的单词

  • 秒条件
    将(反向列1)与布尔模式下的($reversedkey*”匹配)
    例子:
    reversedColumn1==>semaJ
    $reversedkey*=>sema*
    将搜索以ames结尾的单词==>我们有一个匹配项


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

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