0

我正在构建一个非常简单的产品目录,它将产品存储在 mysql 表中,我想尽可能快地搜索产品(并且尽可能相关)。产品数据库将非常大(大约 500.000 个产品),这就是使用“like”而不使用索引的搜索非常慢的原因。

我有很多领域,但我想搜索的唯一领域是:

  • product_id = bigint
  • 标题 = varchar(255)
  • 描述=文本

我尝试尝试全文搜索,但出现了一些问题:

  • 我无法按 product_id 搜索,因为它是大整数,无法在全文索引中编制索引(有时用户知道产品的 ID)
  • 如果我搜索“Meter XY-123”,即使单个产品的标题和描述都包含两个词(“meter”和“xy-123”),我也没有得到任何搜索结果
  • 我无法搜索子字符串 - 例如,如果产品的标题是“Foobar 123”,即使用户搜索它也应该返回:
    • 富吧 123
    • 酒吧 123
    • 富吧 12
    • 等等
  • 结果也应该按某种相关性排序。例如,如果我有两个产品“foobar 123”和“foobar 456”并且用户搜索“foobar 4”,那么应该返回两个产品(匹配任何单词)但第二个产品应该比第一个(不包含数字 4)排名更高(因为它也包含数字 4)。
  • 产品还应根据值所在的字段进行排名。在这种情况下,product_id 字段的权重大于标题,标题的权重也高于描述。例如,如果用户搜索“1234”,则:
    • 排名第一的产品应该是具有 product_id 1234 的产品
    • 之后应该有标题中包含“1234”的排名产品
    • 之后在描述中包含此编号的产品

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

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

谢谢你!

4

1 回答 1

2

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

于 2013-11-27T10:29:00.323 回答