2017-07-29 81 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更頻繁)

相關問題