我有一张包含大约一百万辆车辆记录的表格。我想实现搜索功能,以便用户可以在车辆上搜索,遗憾的是FULLTEXT列包含的数据如...
“Motor Car Fortuner-GJ00XX1234-Toyota”
“汽车Fortuner-GJ00XX04567-丰田”
等.....
这意味着特定记录是“汽车”型号“fortuner”,注册号为“GJ00XX1234”,公司名称为“toyota”。
用户试图搜索“fortuner 1234”或“1234”,因为一般用户不记得完整的注册号码。因此,MySql返回所有带有“fortuner”的记录,但无法搜索“1234”。但是搜索“GJ00XX1234”有效。
我知道使用“LIKE'%1234%'”查询有效,但是存在性能问题所以我必须使用FULLTEXT来实现这一点。
有人可以指导我如何在不修改数据的情况下实现它吗? 感谢。
答案 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