2012-04-14 25 views
2

我剛開始使用的Solr和SolrNet。在我對當前項目進行太多調整之前,我想驗證自己是否正確。這是我想實現:Solr的和SolrNet問題,並指導

基本要求:

  1. 提供,搜索對多個實體(汽車,輪船,飛機,自行車等),我只是做了這些在這裏搜索解決方案。每個實體可以具有可變數量的非對稱數據的字段。
  2. 爲每個實體提供構面。
  3. 爲每個實體提供過濾器。

工作流程:

  1. 與長期用戶搜索。
  2. 四鏈路,一個用於每個實體已顯示具有數值旁邊指示每個實體的命中數。
  3. 用戶單擊一個鏈接並顯示該頁面的面和該實體的搜索結果。

所以,有了這一要求,這裏是我迄今所做的:

  1. 創建一個單一的指標,但與像car_name,car_model,car_company,ship_name,ship_model,ship_company每個實體的具體領域, ship_age,ship_size等
  2. 我在指數,其被設置爲實體之一的字段ENTITY_TYPE。
  3. ID在所有實體中都是唯一的。
  4. 我有一個DisMax搜索處理機solrconfig.xml中,在我把所有的領域(從所有實體)應搜索上。

這裏是我的DisMax搜索處理機的樣子:

<requestHandler name="DisMax" class="solr.SearchHandler"> 
    <lst name="defaults"> 
     <str name="echoParams">explicit</str> 
     <str name="defType">edismax</str> 
     <str name="qf"> 
      car_name car_company car_model ship_name ship_company ship_model ship_sailing_route plane_name plane_company plane_model bicycle_name bicycle_company bicycle_model 
     </str> 
     <str name="q.alt">*:*</str> 
     <str name="rows">10</str> 
     <str name="fl">*,score</str> 
     <str name="facet">on</str> 
     <str name="facet.field">car_comapny</str> 
     <str name="facet.field">car_model</str> 
     <str name="facet.field">ship_name</str> 
     <str name="facet.field">ship_company</str> 
     <str name="facet.field">ship_sailing_route</str> 
     ... 
    </lst> 
</requestHandler> 

最後,這裏是我的問題:

  1. 這是一個索引的路線是正確的做法,或者我應該創建單獨的每個實體的索引?請解釋。
  2. 如果它們應該是單獨的索引,我如何在給定的術語上搜索它們?重要的是,我如何使用SolrNet來做到這一點?
  3. 有沒有一種方法可以搜索使用SolrNet的所有實體並檢索結果?或者是否需要爲每個實體分別執行查詢(可能會並行)使用相同的搜索詞?
  4. 我有應可作爲DisMax處理程序方面,你可以看到的所有字段的列表,這是正確的做法?如果不是,那是什麼?

我相信當我通過我的項目工作時,我會有更多的問題,但現在這會做。

回答

3

如果你將有大量的每個類型的項目,拆分可能是一個明智的想法(只是爲了性能起見,沒有別的)。這也取決於你正在拖入模式的東西之間的相似之處和不同之處。例如,二輪車,汽車,輪船,都有公司,名稱,型號等,因此您可以只使用名稱,型號,公司字段,然後是另一個表示「vehicle_type」的字段。 如果變量字段(稱爲可選字段)僅爲少數,那麼可以爲這些字段設置動態字段,因此您不需要嚴格的模式。

如果你使用不同的索引(和模式),你的查詢需要知道所有不同的字段和模式。更不用說,爲此你需要一個多核實例,並且(AFAIK)你不能一次發送查詢到多個核心。

這取決於你想要做什麼查詢。假設您想要搜索名稱爲「vairo」的車輛,但用戶不指定他是否想要bicicles或汽車等。您需要將搜索分配到所有不同的核心,如

/solr/bicicles/select?q=bicicle_name:vairo 
/solr/cars/select?q=car_name:vairo 
/solr/ships/select?q=ship_name:vairo 

然後合併結果。 如果您將所有內容都放在單個索引上,則只需搜索q=name:vairo即可。然後,通常情況下,您會面對「vehicle_type」,告訴用戶有1000個這樣的名字,還有其他幾輛車。如果用戶現在指定「確定,只給予bicicles」,您保留之前的查詢,但添加& fq = vehicle_type:bicicle

這比處理根據過濾器查詢哪個索引的邏輯要方便得多。 同時合併來自多個響應的結果也不是微不足道的。

在我們公司,我們對所有類別使用單一的solr。很明顯,他們都擁有不存在的其他選擇權(比如房地產與車輛)。有些處理動態字段和其他一些正常字段。如果您沒有在文檔中發送任何內容,SOLR是可以的。

例如:

squared_meters 
rooms 
vehicle_type 
vehicle_doors 

在一個單一的索引。正如你可能猜到的那樣,當我們索引一個文檔時,有一半以上的字段是空的(無論是汽車還是房子)。 SOLR在查詢和索引時間都是絕對可以的。

所以,總結一下:

  • 考慮你想要做什麼樣的查詢。如果你搜索自行車或汽車,不同的索引是好的
  • 考慮你將有多少文件。如果他們將成爲數百萬人,那麼這種邏輯分割將是您可以做得更好的表現的最佳方式,但是您必須做更多的查詢!
+0

您只是部分回答了我的問題,所以我不接受它作爲正式答案,但非常感謝您的意見。由於我索引的記錄量很低,因此我將使用單一索引。 – codelove 2012-04-17 14:30:35