我正在构建一个非常简单的产品目录,它将产品存储在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秒)这太慢了。
我不希望只使用单个查询就能实现一切,但我正在寻找一种快速且尽可能相关的解决方案。如果这意味着建立某种自定义单词索引或类似的我也愿意这样做,我只是想知道如何管理它?
谢谢你!