Mysql SQL搜索结果排名
我有一个表调用对象,其中有以下列:Mysql SQL搜索结果排名,mysql,sql,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_
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”或显示结果的结果,并按相关性顺序对它们进行排序。我怎样才能做到这一点
谢谢。这应该可以做到这一点-您可能需要过滤掉重复的内容,但基本思想是显而易见的
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
您可以使用MySQL全文索引来实现这一点。这需要MyISAM表类型、索引(name_english、name_japanese、name_french、object_description)或任何要搜索的字段,以及适当使用匹配项。。。完全针对该列集合上的运算符
运行上述查询后,您将获得所有类型的结果,包括您不感兴趣的结果,但是您可以在上面的结果集(由mysql服务器返回)上使用正则表达式来过滤您需要的结果 谢谢,但由于我是新手,请注意我天真的问题。由于我只是比较/搜索对象的名称,一些人告诉我,除非是文本的一段,否则没有必要使用全文,这一点我不确定。将表格转换为MYISAM/全文会影响性能/速度吗?我读过很多文章,但没有一篇能真正解释我的情况。再次感谢您的时间。全文是索引类型。索引是一种加速数据访问(搜索)的数据结构。特定的索引类型FULLTEXT使您能够基于完整(而非部分)单词快速访问所有类型的VARCHAR、CHAR或TEXT字段。这完全符合您的问题陈述。尝试一下,并对其进行基准测试。将表从InnoDB转换为MyISAM会对性能和大小产生影响,特别是在有许多并发写入的情况下。也要以此为基准。您可能希望以1:1的关系将可搜索列设置为单独的表。感谢您的解释。。。由于该表可能每周只更新一次/has write操作,所以我想影响应该是最小的=)我将开始尝试。再次感谢