Mysql(全文?)搜索产品

时间:2013-10-11 07:45:06

标签: php mysql sql search

我正在构建一个非常简单的产品目录,它将产品存储在mysql表中,我希望尽可能快地搜索产品(并尽可能相关)。产品数据库将非常大(约500,000个产品),这就是为什么使用“喜欢”不使用索引的搜索速度非常慢。

我有很多字段,但我想搜索的唯一字段是:

  • product_id = bigint
  • title = varchar(255)
  • description = text

我尝试过全文搜索,但有一些问题:

  • 我无法通过product_id进行搜索,因为它是一个大整数,无法在全文索引中编入索引(有时用户知道产品的ID)
  • 如果我搜索“Meter XY-123”我没有搜索结果,即使单个产品的标题和描述包含两个单词(“米”和“xy-123”)
  • 我无法搜索子串 - 例如如果产品的标题是“Foobar 123”,即使用户搜索以下内容,也应该返回:
    • foo bar 123
    • bar 123
    • foobar 12
    • FOO
  • 结果也应按某种相关性排序。例如,如果我有两个产品“foobar 123”和“foobar 456”并且用户搜索“foobar 4”那么这两个产品应该被退回(匹配任何单词)但是第二个产品应该排名更高(因为它还包含数字4)而不是第一个(不包含4号)。
  • 产品也应根据找到该值的字段进行排名。在这种情况下,product_id字段的权重大于title,其权重也高于描述。例如。如果用户搜索“1234”,则:
    • 首先排名的产品应该是具有product_id 1234
    • 的产品
    • 之后应该在标题
    • 中对包含“1234”的产品进行排名
    • 之后在说明中包含此号码的产品

在这张桌子上进行搜索的最佳方法是什么?在我的情况下给出好结果的唯一方法是拆分查询字符串并使用“like”运算符查询每个字符串的多个查询并以某种方式计算权重,但此解决方案工作非常慢(单个查询甚至超过15秒)这太慢了。

我不希望只使用单个查询就能实现一切,但我正在寻找一种快速且尽可能相关的解决方案。如果这意味着建立某种自定义单词索引或类似的我也愿意这样做,我只是想知道如何管理它?

谢谢你!

1 个答案:

答案 0 :(得分:0)

我们将搜索迁移到Sphinx。现在我们需要对结果进行微调。