【发布时间】:2013-10-19 05:21:46
【问题描述】:
我正在构建一个非常简单的产品目录,它将产品存储在 mysql 表中,我想尽可能快地搜索产品(并且尽可能相关)。产品数据库将非常大(大约 500.000 种产品),这就是使用“like”而不使用索引的搜索非常慢的原因。
我有很多字段,但我想搜索的只有:
- product_id = bigint
- title = varchar(255)
- 描述 = 文本
我尝试过全文搜索,但出现了一些问题:
- 我无法按 product_id 进行搜索,因为它是大整数,无法在全文索引中建立索引(有时用户知道产品的 ID)
- 如果我搜索“Meter XY-123”,即使单个产品的标题和描述同时包含两个词(“meter”和“xy-123”),我也没有得到任何搜索结果
- 我无法搜索子字符串 - 例如如果产品的标题是“Foobar 123”,即使用户搜索:
- 富酒吧 123
- 酒吧 123
- foobar 12
- 富
- 等
- 结果也应该按某种相关性排序。例如如果我有两个产品“foobar 123”和“foobar 456”并且用户搜索“foobar 4”,那么这两个产品都应该返回(匹配任何单词)但是第二个产品应该排名更高(因为它也包含数字 4)比第一个(不包含数字 4)。
- 还应根据值所在的字段对产品进行排名。在这种情况下,product_id 字段的权重大于标题,标题的权重也高于描述。例如。如果用户搜索“1234”,则:
- 排名第一的产品应该是 product_id 为 1234 的产品
- 之后应该有标题中包含“1234”的排名产品
- 在描述中包含此编号的产品
像这样在此表上进行搜索的最佳方法是什么?在我的情况下,给出好的结果的唯一方法是拆分查询字符串并使用“like”运算符对每个字符串查询多个查询,并以某种方式计算权重,但这个解决方案的工作速度非常慢(单个查询甚至超过 15 秒)这太慢了)。
我不希望仅使用单个查询就可以实现一切,但我正在寻找一种快速且尽可能相关的解决方案。如果这意味着建立某种自定义词索引或类似的我也愿意这样做,我只需要知道如何管理它?
谢谢!
【问题讨论】:
-
不确定,但您可以尝试使用带有查询扩展的全文搜索
-
我正在使用 Sphinx 搜索引擎。它非常适合全文搜索。见:sphinxsearch.com/docs/2.1.2
-
不幸的是,Sphinx 不是一个选项。我只在寻找 mysql (&php) 选项。
-
你能给我一个这样的查询扩展的例子吗?