php - Mysql(全文?)搜索产品

标签 php mysql sql search

我正在构建一个非常简单的产品目录,它将在 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/

相关文章:

php - MySQL 查询中的 session 变量

sql - 替换 LEFT OUTER JOIN 中返回的空值

php - 使用 websockets 的私有(private)消息

javascript - 我应该如何修改 PHP 和 Javascript 文件,以便复选框是强制性的?

php - 尝试在 laravel 5.5 中获取非对象的属性

mysql - 无法理解涉及不同表的不同列的 SQL 查询中的控制流

php - 如何使用自定义日期设置仅选择今天的记录

python - 带有 extra() 的 Django 查询集

php - Laravel 5.4 迁移 :generate fails with Way\Generators\Filesystem\FileNotFound error

php - Codeigniter:获取相同值之间的公共(public)列值