2013-10-11 148 views
0

我正在构建一个非常简单的产品目录,该产品目录将存储产品在mysql表中,并且我想尽可能快地(并且尽可能相关)搜索产品。产品数据库将会非常大(大约500,000个产品),这就是为什么使用“不喜欢”索引的“like”进行搜索非常缓慢。Mysql(全文?)搜索产品

我有许多字段,但只有那些我想搜索有:

  • 的product_id = BIGINT
  • 标题= VARCHAR(255)
  • 描述=文本

我试着尝试全文搜索,但有一些问题:

  • 我无法通过product_id进行搜索,因为它是大整数,无法在全文索引内进行索引(有时用户知道产品的ID)
  • 如果我搜索“Meter XY-123”,则不会收到搜索结果即使单个产品的标题和描述都包含单词(“米”和“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秒这太慢了)。

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

谢谢!

+0

不确定,但您可以尝试使用查询扩展的全文搜索 –

+0

我正在使用Sphinx搜索引擎。它适用于全文搜索。请参阅:http://sphinxsearch.com/docs/2.1.2/ – Adam

+0

不幸的是狮身人面像不是一个选项。我只查找mysql(&php)选项。 – j99

回答

0

我们将搜索迁移到狮身人面像..现在我们需要微调结果。