【问题标题】:MySql FULLTEXT search characters in between words [closed]MySql FULLTEXT 在单词之间搜索字符[关闭]
【发布时间】:2015-11-05 09:13:06
【问题描述】:

我有一张表,其中包含大约一百万条车辆记录。我想实现搜索功能,以便用户可以在车辆上进行搜索,不幸的是 FULLTEXT 列包含的数据...

“汽车Fortuner-GJ00XX1234-丰田”
“汽车Fortuner-GJ00XX04567-丰田”
等等……

这意味着特定记录是针对注册号为“GJ00XX1234”和公司名称“toyota”的“motor car”型号“fortuner”。

用户尝试搜索“fortuner 1234”或“1234”,因为通常用户不记得完整的注册号。结果,MySql 返回所有带有“fortuner”的记录,但它无法搜索“1234”。但是搜索“GJ00XX1234”有效。

我知道使用“LIKE '%1234%'”查询有效,但存在性能问题,因此我必须仅使用 FULLTEXT 来实现。

有人可以指导我如何在不修改数据的情况下实现它吗? 谢谢。

【问题讨论】:

  • 我尊重投票,但应该提到他为什么拒绝投票这个问题。

标签: php mysql full-text-search full-text-indexing


【解决方案1】:

在不分离/添加到索引的情况下,您无法通过使用 FULLTEXT 搜索来实现此目的。有一个 boolean full-text search mode 允许附加一个小丑 * 但由于 MySQL 中索引的工作方式,它是 not possible to prepend the joker

为了保持全文搜索的性能优势,最好的办法可能是在全文索引中包含包含数字的第二列,或者设置一个仅用于搜索的新列,其中包含类似motor car fortuner gj00xx1234 toyota 1234 的内容。

如果您在前面加上%,例如。 LIKE %1234%REGEXP 会影响您的性能,因为无法使用索引 - 导致全表扫描。取决于数据大小有多密集。

【讨论】:

    【解决方案2】:

    用空格分割搜索字符串并像这样添加查询

    WHERE data LIKE '%fortuner%' OR data LIKE '%1234%'
    

    或更简单的术语

    WHERE data REGEXP 'fortuner|1234'
    

    在后一种情况下,您的 PHP 代码可以是:

    $searchString = "fortuner 1234";
    $search = str_replace(' ','|','fortuner 1234');
    

    更新:

    全文:

    WHERE          
    MATCH (data) 
    AGAINST ('+fortuner +1234' IN BOOLEAN MODE)
    

    这里是manual

    注意

    在实现这个特性时,MySQL 使用了有时被称为 作为隐含的布尔逻辑,其中

    • 代表与

    • 代表NOT

    [无运算符]暗示或

    【讨论】:

    • 我知道使用 'LIKE' 可以实现,但我有非常大量的数据,所以我只能使用 'FULLTEXT' 索引。
    • 创建一个包含 FULLTEXT 中可能的关键字的列。从中搜索
    • 通过创建新列和放置关键字(仅用于搜索目的)来创建冗余并不是一个好主意。
    • 查看更新的答案
    • AGAINST ('+fortuner +1234' IN BOOLEAN MODE) 找不到任何记录
    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2014-04-01
    • 1970-01-01
    相关资源
    最近更新 更多