MySql FULLTEXT在单词之间搜索字符

时间:2015-11-05 09:13:06

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

我有一张包含大约一百万辆车辆记录的表格。我想实现搜索功能,以便用户可以在车辆上搜索,遗憾的是FULLTEXT列包含的数据如...

  

“Motor Car Fortuner-GJ00XX1234-Toyota”
  “汽车Fortuner-GJ00XX04567-丰田”
  等.....

这意味着特定记录是“汽车”型号“fortuner”,注册号为“GJ00XX1234”,公司名称为“toyota”。

用户试图搜索“fortuner 1234”或“1234”,因为一般用户不记得完整的注册号码。因此,MySql返回所有带有“fortuner”的记录,但无法搜索“1234”。但是搜索“GJ00XX1234”有效。

我知道使用“LIKE'%1234%'”查询有效,但是存在性能问题所以我必须使用FULLTEXT来实现这一点。

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

2 个答案:

答案 0 :(得分:1)

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

为了保持全文搜索的性能优势,最好的想法可能是包含第二列,其中包含全文索引中的数字或仅为搜索设置新列,其中包含motor car fortuner gj00xx1234 toyota 1234之类的内容

如果您预先%,例如。 LIKE %1234%REGEXP它会影响您的性能,因为无法使用索引 - 导致全表扫描。取决于数据大小有多强烈。

答案 1 :(得分:0)

按空格拆分搜索字符串,并像这样添加查询

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

或更简单的术语

WHERE data REGEXP 'fortuner|1234'

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

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

<强>更新

对于FULLTEXT:

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

以下是manual

  

注意

     

在实现此功能时,MySQL使用有时会引用的内容   作为隐含的布尔逻辑,其中

     
      
  • 代表AND

  •   
  • 代表NOT

  •   
     

[no operator]暗示OR