我有一张产品表,例如汽车。我希望用户能够使用多个术语进行搜索,例如用于自动完成。 LIKE%term%是缓慢的,因为它是一张巨大的牌桌。为了加快速度,我想使用MySQL的全文搜索。我使用ft_min_word_lenght = 1。
想象一下产品名称是"雷克萨斯RX450H"。然后将两个单词编入索引:" Lexus"和" RX450H"。
MATCH (productname) AGAINST ('+lex* +rx45*' IN BOOLEAN MODE) ')
..会匹配这个产品,很好。
但
MATCH (productname) AGAINST ('+lex* +450*' IN BOOLEAN MODE) ')
不会,因为搜索单词的开头是必不可少的。
用户可能知道该号码,但可能会忘记这些字母。我希望第二个查询匹配。
如果产品是: "雷克萨斯RX 450 H",然后最后一个查询匹配,问题解决了。
我能做的是在表格中创建第二列,并通过在它们之间放置一个空格来分割所有字母/数字,例如使用正则表达式。然后,应该在这个专栏上进行搜索,瞧,问题解决了。
但是,(大)表几乎会变成两倍大,我想知道是否有可能告诉MySQL执行所描述的索引,而不创建额外的列。
答案 0 :(得分:-1)
看起来查询正在返回行。
MATCH(productname)AGAINST('+ lex * + 450 *'在BOOLEAN模式中)')
基本上说匹配文本以'lex'开头,以'450'开头。您的数据匹配'lex'但不匹配'450'。删除'+405'上的星号,我相信这对你有用。
MATCH(productname)AGAINST('+ lex * +450'IN BOOLEAN MODE)')
应该返回'雷克萨斯RX 450 H'和'雷克萨斯RX450H'。