2013-04-18 81 views
1

我想展示所謂的產品變體的類似產品。目前我做如下:顯示類似的產品或變體

public IList<Product> GetVariants(string productName) 
{ 
    EFContext db = new EFContext(); //using Entity Framework 
    return db.Products 
      .Where(product = > product.ProductName == productName) 
      .ToList(); 
} 

但是,這會導致精確匹配,即目前的產品本身。我在考慮使用Levenshtein距離作爲獲得類似產品的基礎。但是,在此之前,我想檢查一下大多數開發人員爲獲取變體做些什麼?

  1. 使用Levenshtein距離是否很好?它在工業中用於這個目的嗎?
  2. 我是否必須在數據庫中添加另一個表,以便在將產品添加到數據庫時顯示產品的變體?

回答

1

我使用了Jaro-Winkler distance有效地解決了我後來寫了一個系統中的拼寫錯誤。國際海事組織,它比簡單的編輯距離計算好得多,因爲它可以相當有效地解釋字符串長度。 SO上的this question用於開源實現。

我最終把它寫入C#並將其作爲SQL CLR函數導入SQL服務器,但它仍然相對較慢。它在我的情況下工作主要是因爲這樣的查詢很少執行(一天100-200)。

如果你期望很多流量,你必須建立一個索引來加快查找速度。對此的一個策略是週期性地計算每對產品之間的每對產品之間的距離,並且如果距離超過某個閾值,則將其存儲在索引表中。爲減少需要完成的工作量,您可以每天只運行一次或兩次,並且可以將其限制爲自上次運行以來只有新的或已修改的記錄。然後,您可以查找類似的產品並快速按距離排序。

+0

是的,它是一個高流量的網站。 – 2013-04-18 02:51:42