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