使用Mysql freetext和MATCH AGAINST进行产品搜索

时间:2014-03-06 03:20:00

标签: mysql

我有一个数据库结构,其中包含有关汽车轮胎的数据等。 由于这些数据分布在多个字段(名称,英寸,配置文件,et,cb等)中,因此我创建了一个包含搜索所需内容的字段。该字段的示例如下:

Nokian W+ 205/65R15 94T 69512 Frictiontire 2056515F NOK
Fulda TRAMP 4X4 255/55R16 103h 1625555FUTR4X4 561987 Summertire 2555516S FUL

现在到了有趣的部分:我想我可以简单地在这个字段中添加一个FULLTEXT索引,并通过匹配用户在搜索字段中写入的内容来搜索它。

例如,如果用户写道:     205 / 65R15 Frictiontire

...我会得到一个很好的列表,其中该字段包含类似的数据,但没有这样的运气!

我认为MySQL MATCH AGAINST使用起来会更简单,或者说我做错了。

如果我尝试这样的查询:

SELECT * FROM product_search
WHERE MATCH(str) AGAINST ('Nokian 1856515 Frictiontire') 

我得到的第一个打击是:

Nokian WR D3 205/65R15 99H XL 69513 Frictiontire 2056515F NOK

当然,“Nokian”和“Frictiontire”都在那里但不是“1856515”。并且有很多行包含所有3个字符串(300个中的300个)! 我试图让它变得更复杂,但没有任何更大的成功,即使我能够使它工作,我也会失去只需从用户输入字符串所需的简单性。

我尝试过很多不同的东西,包括“BOOLEAN MODE”和“NATURAL MODE”。

简而言之:我希望将搜索字符串与所需信息的字段进行匹配。 这可以在MySQL中完成吗?

1 个答案:

答案 0 :(得分:0)

如果您想从搜索中订购结果,请使用order by

SELECT *
FROM product_search
WHERE MATCH(str) AGAINST ('Nokian 1856515 Frictiontire') 
ORDER BY MATCH(str) AGAINST ('Nokian 1856515 Frictiontire')  DESC;

如果要求所有三个术语都在结果集的每一行中,请使用布尔模式搜索。