我在php和mysql中创建价格比较网站。所以我需要找到类似的产品并将其映射到创建价格比较表。在我的数据库中有10,000多种产品可供使用,所以为了找到类似的产品,我在产品名称和描述列中创建了mysql全文索引,并将产品与其他产品进行比较,但我无法获得所需的结果,例如,如果我搜索
搜索“Samsung Galaxy A7(2017)32gb”,获得结果:
注意:在结果集中,只有前两个和第四个产品相似,而不是其他产品
现在,我有疑问:
如何从搜索查询中找到重要的关键字,以便至少在其他产品中需要关键字来了解相似性?例如在上面的搜索查询“三星Galaxy A7”是重要的关键字,并且应该在其他产品中需要结果。我们人类可以知道,“三星Galaxy A7”是来自“三星Galaxy A7(2017)32gb”的重要关键词与其他产品比较,但怎么能知道计算机程序?
有一种算法可以比较类似产品的重要关键字,就像图像比较中的筛选算法一样。
如果您有任何寻找类似产品的好方法,请建议我
答案 0 :(得分:1)
浏览Elasticsearch这是一个搜索引擎。
它可以进行关键字搜索并按分数返回结果。
你可以在某些方面提升或减分, 但是,确定类似人类的关键词还不够聪明。
但是,它可以确定您文档中的常用字词(例如'' a' ...或者' 32gb'如果有很多型号使用这个术语。)并调整这些常用术语的分数以降低分数。 (ES common terms query)
Elasticsearch功能强大(因此它的复杂性),它可以为这个主题提供更多更好的解决方案。
编辑:一个很好的article关于"常见字词查询"和"停用词列表"。如果您需要,停用词可以永久排除规范。有时,"常用术语查询"如果记录数据不够广泛,它将无法工作。 (例如:三星Galaxy比32gb更频繁)
答案 1 :(得分:0)
听起来像一个简单的 LIKE :
SELECT name FROM products WHERE name LIKE 'Samsung Galaxy A7%';
这将选择所有以“Samsung Galaxy A7”开头的产品。 如果您还要选择那些不以#1开头但只包含该名称的人,请将其更改为
WHERE name LIKE '%Samsung Galaxy A7%'
答案 2 :(得分: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,这些问题已经解决了......可能