2017-07-29 97 views
2

我在PHP和MySQL创建价格比较网站。所以我需要找到类似的产品并将其映射到创建价格比较表。在我的数据库10000种产品可供选择,所以找到我已创建产品的名称和说明列MySQL的全文索引,并与其他产品相比产品类似的产品,但我不能得到渴望的结果,例如,如果我搜索如何查找类似产品

搜索 “三星Galaxy A7(2017)32GB”,得到的结果:

  1. 三星Galaxy A7 32GB(2017)
  2. 三星Galaxy A7智能手机
  3. 三星Galaxy J7(2017)32GB的黑色
  4. 三星Galaxy A7 64GB(新)
  5. 三星Galaxy J7总理16GB
  6. 三星Galaxy J7(16GB,黑色)
  7. 三星Galaxy J2专业版(16GB)
  8. 三星Galaxy A5(32GB)
  9. 三星Galaxy S7边缘32GB蓝珊瑚

注:在结果集只有前两个和第四个产品是相似的,而不是其他的都是

现在,我有一个问题:

如何找到搜索查询的重要关键字,因此关键字都至少需要在其他产品要知道相似?例如在上面的搜索查询中“Samsung Galaxy A7”是重要的关键字,并且在其他产品中应该要求结果。我们人类可以知道,“三星Galaxy A7”是“三星Galaxy A7(2017)32gb”与其他产品进行比较的重要关键词,但是如何知道电脑程序呢?

有任何算法通过重要关键词作为像在图像比较SIFT算法来比较相似产品。

如果您有什么好的方法来查找类似产品,请建议我

回答

0

听起来像一个简单的LIKE

SELECT name FROM products WHERE name LIKE 'Samsung Galaxy A7%'; 

这将选择与“三星Galaxy A7”开头的所有产品。 如果你想也选择那些,谁不首发,但只包含该名称,将其更改为

WHERE name LIKE '%Samsung Galaxy A7%' 
+0

这并不像您想的那样简单。如何计算机程序知道使用“三星Galaxy A7”关键字搜索查询“三星Galaxy A7(2017)32GB”? –

0

我想我会用空格分开它们,删除空格,并绕到所有的话LIKE %str% AND - 是这样的:

$search='Samsung Galaxy A7 (2017) 32gb'; 
$split=preg_split('/\s+/u',$search); 
$query='SELECT * FROM tbl WHERE '; 
foreach($split as $str){ 
    $query.='`name` LIKE \'%'.$db->real_escape_string($str).'%\' AND '; 
} 
$query=substr($query,0,-strlen(' AND ')); 
var_dump($query); 
  • 其输出类似SELECT * FROM tbl WHERE `name` LIKE '%Samsung%' AND `name` LIKE '%Galaxy%' AND `name` LIKE '%A7%' AND `name` LIKE '%(2017)%' AND `name` LIKE '%32gb%'(测试代码:https://3v4l.org/30llU

但我敢打赌,有一个专门的搜索库,那里有PHP的地方,这些问题已经解决了......大概

+0

不,这不适用于AND或OR的任何简单的SQL查询。因为您在sql条件下也使用“(2017)32gb”关键字。所以产品“三星Galaxy A7智能手机”不会得到结果,但该产品是相似的。因为产品“Samsung Galaxy J7 Prime 16gb”不相似,所以不能在条件中使用OR。 –

1

看看Elasticsearch这是一个搜索引擎。

它可以做关键字搜索,并按分数返回结果。

您可以在某些方面增加或减少分数, 但它不够聪明,以确定像人类的关键字。

但是,它可以确定文档中的常用术语(如'the','a'或'32gb',如果有多个使用此术语的模型)并调整这些常用术语的分数以较低的分数。 (ES common terms query

Elasticsearch功能强大(以及它的复杂性),它可以有很多更好的解决方案来解决这个问题。

编辑:关于“常用术语查询”和“停用词表”的好的article。停用词可以永久排除规范,如果这是你想要的情况。有时,如果记录数据不够广泛,“常用术语查询”将不起作用。 (例如:三星Galaxy比32gb更频繁)