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

问题描述 投票:0回答:3

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

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

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

mysql database full-text-search boolean match-against
3个回答
9
投票

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

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 结尾的单词 ==> 我们有一个匹配

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


6
投票

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


0
投票

您可以在一个查询中使用

MATCH
LIKE
,这样您还可以在所选列中搜索子字符串:

SELECT * FROM table WHERE col1 LIKE "%string%" OR MATCH (col1, col2, col3) AGAINST ("string");

这允许您搜索某些列上的子字符串并与您的

FULLTEXT
索引进行匹配。

© www.soinside.com 2019 - 2024. All rights reserved.