2011-04-13 70 views
1

我對solr模式設計有一些疑問。基本上我爲產品目錄網站設置了一個搜索引擎,我的表格關係如下。Solr Schema Design

  • Product屬於Merchant
  • Product屬於Brand
  • Product具有屬於許多Categories
  • Category有許多Sub Categories
  • Sub Category有許多Types
  • Type有許多Sub Types

到目前爲止,我的Schema.xml看起來像這樣。

<field name="product_id" type="string" indexed="true" stored="true" required="true" /> 
<field name="name" type="string" indexed="true" stored="true"/> 
<field name="merchant" type="string" indexed="true" stored="true"/> 
<field name="merchant_id" type="string" indexed="true" stored="true"/> 
<field name="brand" type="string" indexed="true" stored="true"/> 
<field name="brand_id" type="string" indexed="true" stored="true"/> 
<field name="categories" type="string" multiValued="true" indexed="true" stored="true"/> 
<field name="sub_categories" type="string" multiValued="true" indexed="true" stored="true"/> 
<field name="types" type="string" multiValued="true" indexed="true" stored="true"/> 
<field name="sub_types" type="string" multiValued="true" indexed="true" stored="true"/> 
<field name="price" type="float" indexed="true" stored="true"/> 
<field name="description" type="text" indexed="true" stored="true"/> 
<field name="image" type="text" indexed="true" stored="true"/> 

<field name="text" type="text" indexed="true" stored="false" multiValued="true"/> 

<uniqueKey>product_id</uniqueKey> 

<defaultSearchField>text</defaultSearchField> 

<solrQueryParser defaultOperator="OR"/> 

<copyField source="name" dest="text"/> 
<copyField source="merchant" dest="text"/> 
<copyField source="brand" dest="text"/> 
<copyField source="categories" dest="text"/> 
<copyField source="sub_categories" dest="text"/> 
<copyField source="types" dest="text"/> 
<copyField source="sub_types" dest="text"/> 

所以我的問題,現在:

1)是架構是否正確?

2)假設我需要找到Category XYZ的產品。我的高級程序員不喜歡通過Category Name查詢solr,而不想使用CategoryID。 他建議存儲CategoryID_CategoryName (1001_Category XYZ),並從網站上發送ID。 (假設帶有空格的名稱無法正常工作)。

所以要找到產品,那麼我應該做的categories部分匹配,並從字符串識別類別ID即(fetch 1001 from 1001_Category XYZ) 或 如果我繼續categories場和設置另一個字段的名稱爲category_ids什麼?這對我來說似乎是更好的選擇。

是否有任何的solr多值字段類型來存儲CategoryIDCategoryName一起?

讓我知道你的想法,謝謝。

回答

3

回答你的問題。

  1. 也許 - 這取決於您計劃如何構建查詢,您打算搜索的內容以及您打算在搜索結果中檢索的內容。在你的模式中,你正在存儲索引一切可能非常低效的東西。索引你想要查詢的內容,存儲你想要檢索/顯示的內容。如果您正在尋找優化,我會審查模式中使用的數據類型 - 儘可能保持原始類型的源數據類型。
  2. 通過CategoryId查詢 - 您的程序員是正確的,您希望按類別ID進行查詢。您在不同字段中存儲ID和名稱的方法也很準確。假設你的基於ID的字段是整數/長整數,你不想把它們構造成字符串而是整數/長整數。
+0

非常感謝你。 - 是的,我現在明白了,我不應該索引/存儲所有的字段。但是我們有一個計劃,不是從數據庫中獲取任何產品數據,而是從Solr讀取所有產品數據。由於這個原因,我們仍然需要Solr的每個領域。 – randika 2011-04-14 18:38:06