Php Mysql(全文?)搜索产品

Php Mysql(全文?)搜索产品,php,mysql,sql,search,Php,Mysql,Sql,Search,我正在构建一个非常简单的产品目录,将产品存储在mysql表中,我希望尽可能快地搜索产品(并且尽可能相关)。产品数据库将相当大(大约50万个产品),这就是为什么使用“like”而不使用索引的搜索速度非常慢的原因 我有许多字段,但我只想搜索以下字段: product_id=bigint title=varchar(255) 描述=文本 我尝试了全文搜索,但出现了一些问题: 我无法按产品id搜索,因为它是大整数,不能在全文索引中索引(有时用户知道产品的id) 如果我搜索“Meter XY-123

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

我有许多字段,但我只想搜索以下字段:

  • product_id=bigint
  • title=varchar(255)
  • 描述=文本
我尝试了全文搜索,但出现了一些问题:

  • 我无法按产品id搜索,因为它是大整数,不能在全文索引中索引(有时用户知道产品的id)
  • 如果我搜索“Meter XY-123”,即使单个产品的标题和描述包含两个词(“Meter”和“XY-123”),我也不会得到任何搜索结果
  • 我无法搜索子字符串-例如,如果产品标题为“Foobar 123”,则即使用户搜索以下内容,也应返回:
    • 富吧123
    • 酒吧123
    • foobar 12
    • 等等
  • 结果也应该按某种相关性排序返回。。e、 g.如果我有两个产品“foobar 123”和“foobar 456”,并且用户搜索“foobar 4”,那么这两个产品都应该返回(匹配任何单词),但是第二个产品的排名(因为它也包含数字4)应该高于第一个产品(不包含数字4)
  • 还应根据价值所在的字段对产品进行排名。在这种情况下,product_id字段的权重大于title,title的权重也高于description。例如,如果用户搜索“1234”,则:
    • 排名第一的产品应该是产品id为1234的产品
    • 之后,应该有排名产品,包括“1234”内的标题
    • 在描述中包含此编号的后续产品
像这样在此表上进行搜索的最佳方法是什么?在我的例子中,给出良好结果的唯一方法是拆分查询字符串,并对每个字符串使用“like”操作符查询多个查询,并以某种方式计算权重,但该解决方案的工作速度非常慢(对于一个太慢的查询,甚至超过15秒)

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


谢谢大家!

我们将搜索迁移到斯芬克斯。。现在我们需要对结果进行微调。

不确定,但您可以尝试使用查询扩展进行全文搜索。我使用的是Sphinx搜索引擎。它的工作完美的全文搜索。请看:不幸的是,斯芬克斯不是一个选项。我只寻找mysql(&php)选项。你能给我一个这样的查询扩展的例子吗?