2013-01-25 59 views
0

我目前在複雜的URL處理概念問題上掙扎。該應用程序有一個產品屬性數據庫表/集合與所有不同的產品類型(即類別,顏色,製造商,材料等)。複雜的URL處理概念

{_id:1,alias:"mercedes-benz",type:"brand"}, 
{_id:2,alias:"suv-cars",type:"category"}, 
{_id:3,alias:"cars",type:"category"}, 
{_‌​id:4,alias:"toyota",type:"manufacturer"}, 
{_id:5,alias:"red",type:"color"}, 
{_id:6,alias:"yellow",type:"color"}, 
{_id:7,alias:"bmw",type:"manufacturer"}, 
{_id:8,alias:"leather",type:"material"} 
... 

現在的任務是處理在每一個(!)可能的順序檢索包括產品性能低於風格的URL請求。只允許字符是破折號(定居SEO的要求,有些屬性也可以通過themselve包括破折號 - 我覺得也是一個很重要的一點 - 即類別「的SUV車」或製造商「梅賽德斯 - 奔馳」):

http:\\www.example.com\{category}-{color}-{manufacturer}-{material} 
http:\\www.example.com\{color}-{manufacturer} 
http:\\www.example.com\{color}-{category}-{material}-{manufacturer} 
http:\\www.example.com\{category}-{color}-nonexistingproperty-{manufacturer} 
http:\\www.example.com\{color}-{category}-{manufacturer} 
http:\\www.example.com\{manufacturer} 
http:\\www.example.com\{manufacturer}-{category}-{color}-{material} 
http:\\www.example.com\{category} 
http:\\www.example.com\{manufacturer}-nonexistingproperty-{category}-{color}-{material} 
http:\\www.example.com\{color}-crap-{manufacturer} 
... 

...所以:屬性的每一個訂單應該被允許!結果必須是關於每個URL-Request使用的屬性的信息(順便說一下,重複的內容將通過重定向和預定義的模式來解決)。 「nonexistingproperties」/「廢話」是可能的,應該被忽略。

UPDATE:

理念1:一個方法,我想這個問題是由破折號分割的查詢字符串和值分析它們的值,這個問題:在兩個或三個或一些屬性的更多字的組合有太多不同的組合和變化,所以查詢的loooot殺死這個想法我覺得..

理念2:另一種方式是建立一個(在我看來)過大別名/網址表與所有不同的組合,但我認爲這是隻是一個醜陋的解決方法。大約有15000個不同的屬性,因此不同排序順序中的別名數量正在消除這個想法。

想法3:輪到你了!感謝您的精神和時間。

回答

0

雖然你的問題有點寬泛,但下面是一些想法。除非你找到一個完全按照你想要的方式工作的免費或商業引擎,否則沒有一個令人敬畏的答案。

我想到你的問題的方式是將URL視爲關鍵字列表。

  • 使用Lucene作爲關鍵字/標籤系統。這是good的類型,你建議你想搜索,包括短語,莖等
  • 存儲和指數選擇的數據庫中的數據,但關鍵字拉入內存,並建立所有關鍵字VS項目的位索引。遍歷關鍵字表生成加權結果。如果關鍵字的順序很重要,那麼您還需要根據字詞順序將結果集傳遞給權重。這些類型的搜索總是需要快速設置結果集,以便快速返回結果。
  • 將結果緩存爲正常工作匹配的結果,並優先考慮用戶似乎最多點擊給定網址的結果。
  • 在MongoDB中使用tag索引攻擊數據庫。你仍然需要合併和加權結果。非常密集並且不太可能很好地使用數據庫資源。
  • 閱讀關於關鍵詞搜索的一些學術論文。這是一個受歡迎的話題。
  • 構建在他們破折號字表和規範化/運行你的查詢
  • 之前轉換那些經常檢查第一
+0

謝謝你的有趣方法!我完全同意這個問題沒有開箱即用的解決方案:)目前我們使用MongoDB作爲數據庫和Elasticsearch for Search ...您能否詳細介紹一下您將如何構建Lucene/ES索引或MongoDB Collection主要獲得**結果正確加權**?我們面臨的挑戰是如何爲每種類型的產品屬性獲得**最佳單一結果,對嗎?這意味着MongoDB中的聚合查詢或Elasticsearch中的分面搜索,對吧? – davidone

+0

對於MongoDB中的權重,我認爲最好的做法是對第一遍中的文檔進行第二次傳遞,這可能是候選人。然後你需要根據順序來加權。 (同樣,我不確定MongoDB是否適合這項工作)。對於Lucene來說,只要令牌和字段的索引正確,我希望它在單詞按正確順序(精確匹配)時返回合理的加權搜索響應,而不是正確的單詞,不同的順序。我對ES沒有經驗。是的,這可能是一個方面搜索(從文檔的快速掃描)。 – WiredPrairie

+0

感謝您的快速回復!我認爲搜索技術將是該szenario的最佳選擇,並且您在這一點上是正確的。謝謝!所以我認爲解決方案可能是一個產品屬性Lucene/Elasticsearch索引與不同的類型和別名。你知道怎麼可能查詢Lucene並獲得**每個類型**的最佳匹配項目,也就是說,您可以獲得最匹配的製造商,最匹配的類別,最匹配的顏色等等查詢網址?如果限制爲5個結果,可能只有5個最佳匹配顏色? – davidone

0

如果您將所有屬性值限制爲唯一,則這可能有效。所以,你製作了一組類別+顏色+製造商等等。所有的值都必須是唯一的。這將允許您查找該值的屬性。 該數據結構應該是相當簡單:

{_id:ValueOfTheProperty, Property:TypeOfProperty} 

下面是一些可能的樣本:

{ _id: Red, Property: Color } 
{ _id: Green, Property: Color } 
{ _id: Boots, Property: Category } 
{ _id: Shoes, Property: Category } 
... 

這種方式,順序並不重要,你可以將它們轉換成一個單一的傳遞給地圖:

{ Color: Red, Category: Boots } 

雖然,我在這裏預測了一些與ambigous名稱有關的問題。

+0

感謝您的回覆弗拉基米爾全精確匹配! 「你做了一組類別+顏色+製造商」是什麼意思?我如何拆分URL請求中的條款?如何處理這兩個字組合?如何處理不同的排序命令?數據庫產品屬性表/集合如下所示: '{_id:1,別名:「mercedes-benz」,類型:「brand」},{_id:2,別名:「suv-cars」,類型:「category 「},{_ ID:3,別名:」 汽車」,類型: 「類別」},{_ ID:4,別名: 「豐田」,類型: 「製造商」},{_ ID:5,別名: 「紅」,鍵入:「color」}'最後,我需要通過與產品poperties匹配的URL的id和type。 – davidone

+0

只用破折號分開。然後通過id查找值。我使用_id來存儲值,以惡化,所有屬性類型中的值必須是唯一的。而且你沒有提到有關排序的任何內容。 –