1

我有一张产品表,例如汽车。我希望用户能够使用多个术语进行搜索,例如自动完成。LIKE %term% 会变慢,因为它是一个巨大的表。为了让它更快,我想使用 MySQL 的全文搜索。我使用 ft_min_word_lenght = 1。

想象一下产品名称是“Lexus RX450H”。然后索引两个词:“Lexus”和“RX450H”。

MATCH (productname) AGAINST ('+lex* +rx45*' IN BOOLEAN MODE) ')

..会匹配这个产品,好。

MATCH (productname) AGAINST ('+lex* +450*' IN BOOLEAN MODE) ')

不会,因为必须搜索单词的开头。

用户可能知道数字,但可能会忘记字母。我希望第二个查询匹配。

如果产品是:“Lexus RX 450 H”,那么最后一个查询将匹配,问题已解决。

我可以做的是在表中创建第二列,并通过在它们之间放置一个空格来拆分所有字母/数字,例如使用正则表达式。然后,应该在此列上进行搜索,瞧,问题解决了。

但是,(大)表将变得几乎两倍大,我想知道是否可以告诉 MySQL 执行所描述的索引,而无需创建额外的列。

4

1 回答 1

-1

看起来查询正在返回应有的行。

MATCH (productname) AGAINST ('+lex* +450*' IN BOOLEAN MODE)')

本质上说匹配文本以“lex”开头并以“450”开头。您的数据在“lex”上匹配,但在“450”上不匹配。删除“+405”上的星号,我相信这对你有用。

MATCH (productname) AGAINST ('+lex* +450' IN BOOLEAN MODE)')

应该返回“Lexus RX 450 H”和“Lexus RX450H”。

于 2013-05-17T13:30:33.280 回答