SQL搜索结果排名

时间:2011-03-28 12:07:59

标签: mysql sql

我有一个表调用对象,其中有列:

object_id, 
name_english(vchar), 
name_japanese(vchar), 
name_french(vchar), 
object_description 
每个对象

当用户执行搜索时,他们可能会输入英语,日语或法语......我的sql语句是:

SELECT  
 o.object_id,  
 o.name_english,
 o.name_japanese,  
 o.name_french,  
 o.object_description  
FROM 
 objects AS o
WHERE 
 o.name_english LIKE CONCAT('%',:search,'%') OR 
 o.name_japanese LIKE CONCAT('%',:search,'%') OR 
 o.name_french LIKE CONCAT('%',:search,'%')    
ORDER BY 
 o.name_english, o.name_japanese, o.name_french ASC

有些条目如下:

Tin spoon,  
Tin Foil,  
Doctor Martin Shoes,  
Martini glass,  
Cutting board,  
Ting Soda.   

因此,当用户搜索单词“Tin”时,它将返回这些单词的所有结果,但我只想返回特定包括术语“Tin”的结果或显示结果并按相关性顺序对它们进行排名。我怎样才能做到这一点?

感谢。

3 个答案:

答案 0 :(得分:4)

你可以使用MySQL FULLTEXT索引来做到这一点。这需要MyISAM表类型,索引(name_english,name_japanese,name_french,object_description)或您要搜索的任何字段,以及在该列列上恰当使用MATCH ... AGAINST运算符。

请参阅http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html上的手册以及下页http://dev.mysql.com/doc/refman/5.5/en/fulltext-natural-language.html

中的示例

答案 1 :(得分:1)

运行上面的查询后,您将得到所有类型的结果,包括您不感兴趣的结果,但您可以在上面的结果(由mysql服务器返回)上使用正则表达式来过滤掉您需要的内容。

答案 2 :(得分:0)

这应该可以解决问题 - 您可能需要过滤掉重复项,但基本想法很明显。

    SELECT  
    `object`.`object_id`,  
    `object`.`name_english`,
    `object`.`name_japanese`,  
    `object`.`name_french`,  
    `object`.`object_info`, 1 as ranking   
    FROM `objects` AS `object`
    WHERE `object`.`name_english` LIKE CONCAT(:search,'%') OR `object`.`name_japanese` LIKE CONCAT(:search,'%') OR `object`.`name_french` LIKE CONCAT(:search,'%')
union 
    SELECT  
    `object`.`object_id`,  
    `object`.`name_english`,
    `object`.`name_japanese`,  
    `object`.`name_french`,  
    `object`.`object_info`, 10 as ranking   
    FROM `objects` AS `object`
    WHERE `object`.`name_english` LIKE CONCAT('%',:search,'%') OR `object`.`name_japanese` LIKE CONCAT('%',:search,'%') OR `object`.`name_french` LIKE CONCAT('%',:search,'%') 
ORDER BY ranking, `object`.`name_english`, `object`.`name_japanese`, `object`.`name_french` ASC