【问题标题】:Mysql (fulltext?) search for productsMysql(全文?)搜索产品
【发布时间】: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) 选项。
  • 你能给我一个这样的查询扩展的例子吗?

标签: php mysql sql search


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 2013-03-12
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多