我正在建立一个非常简单的产品目录,该产品目录将产品存储在mysql表中,并且我想尽快(且尽可能相关)搜索产品。产品数据库将非常大(大约50万个产品),这就是为什么不使用索引的使用“顶”的搜索非常慢的原因。
我有很多字段,但我要搜索的唯一字段是:
product_id = bigint
标题= varchar(255)
说明=文字
我尝试尝试全文搜索,但存在一些问题:
我无法按product_id进行搜索,因为它是大整数,并且无法在全文索引中建立索引(有时用户知道产品的ID)
如果我搜索“ Meter XY-123”,即使单个产品的标题和说明都包含两个单词(“ meter”和“ xy-123”),也不会获得搜索结果
我无法搜索子字符串-例如如果产品标题为“ Foobar 123”,则即使用户搜索以下内容,也应返回:
foo bar 123
酒吧123
foobar 12
富
等等
结果还应按某种相关性排序返回。如果我有两个产品“ foobar 123”和“ foobar 456”,并且用户搜索“ foobar 4”,则两个产品均应返回(匹配任何单词),但第二个产品的排名应高于(因为它还包含数字4)第一个(不包含数字4)。
产品还应该根据在哪个字段中找到该值进行排序。在这种情况下,product_id字段的权重大于标题的权重,标题的权重也比说明的权重高。例如。如果用户搜索“ 1234”,则:
排名第一的产品应该是具有product_id 1234的产品
之后,标题中应该包含“ 1234”的排名产品
之后在说明中包含该编号的产品
像这样在此表上进行搜索的最佳方法是什么?对于我来说,提供良好结果的唯一方法是拆分查询字符串,并使用“ like”运算符为每个字符串查询多个查询,并以某种方式计算权重,但是此解决方案的运行速度非常慢(单个查询甚至超过15秒)这太慢了)。
我不希望仅使用单个查询就可以实现所有功能,但是我正在寻找一种快速且尽可能相关的解决方案。如果这意味着建立某种自定义单词索引或类似的单词,我也愿意这样做,那么我只需要一个如何管理它的想法?
谢谢!
最佳答案
我们将搜索迁移到Sphinx。现在,我们需要微调结果。