2013-11-20 72 views
1

我需要存儲和檢索結果作爲多維樹而不是平面「鍵」=>「值」對。讓我以一個例子來解釋,我有許多類別的產品,每個類別都有一個優先級值。樣本結構:如何將Apache Solr字段存儲並檢索爲樹(多維數組)?

{ 
    name: "Sample Product" 
    categories: [ 
    { 
    category: "Category 1", 
    priority: 9 
    }, 
    { 
    category: "Category 2", 
    priority: 5 
    } 
    ... 
    ] 
} 

這裏是我的數據-config.xml中:

<dataConfig> 
    <dataSource name="ds" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/dbname" user="user" password="pass"/> 

    <document name="products"> 
    <entity name="product" query="SELECT name FROM dbname.product"> 

     <field name="name" column="name" /> 

     <entity name="categories" query="SELECT category, priority FROM dbname.category WHERE product_id='${product.id}'"> 
     <field name="category" column="category" /> 
     <field name="priority" column="priority" /> 
     </entity> 
    </entity> 
    </document> 
</dataConfig> 

Schema.xml的:

<schema name="Products" version="1.1"> 
    <fields> 
    <field name="name" type="string" indexed="true" stored="true" multiValued="false" required="true" /> 
    <field name="category" type="string" indexed="true" stored="true" multiValued="true" /> 
    <field name="priority" type="sint" indexed="true" stored="true" multiValued="true" /> 
    </fields> 

    ... 
</schema> 

這是一個簡單的查詢結果:

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 14 
    }, 
    "response": { 
    "numFound": 45, 
    "start": 0, 
    "docs": [ 
     { 
     "name": "Product Name", 
     "category": [ 
      "Category 1", 
      "Category 2" 
     ], 
     "priority": [ 
      8, 
      6 
     ] 
     }, 
     ... 

我想要的是這樣的:

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 14 
    }, 
    "response": { 
    "numFound": 45, 
    "start": 0, 
    "docs": [ 
     { 
     "name": "Product Name", 
     "categories": [ 
      { 
      "name": "Category 1", 
      "priority": 8 
      }, 
      { 
      "name": "Category 2", 
      "priority": 6 
      } 
      ... 
     ] 
     }, 
     ... 

所以當我根據優先級排序結果時,我不會失去類別和優先級之間的連接。因此,我可以爲PHP中的每個產品選擇1,2或3個類別。否則,我必須在PHP端進行一些自定義排序,以選擇我不想要的頂級類別。我想在Solr服務器上進行所有搜索和排序。

我使用Apache Solr實現4.5.1

回答

1

這裏有一個快速的方法來實現這一目標。您可以連接優先級和名稱字段。

所以,你的數據會看起來像:

{ 
    name: "Sample Product" 
    categories: [ 
    { 
    priority_category: "9_Category 1", 
    }, 
    { 
    priority_category: "5_Category 2", 
    } 
    ... 
    ] 
} 

然後你就可以本地排序Solr中的priority_category字段,然後,如果你想輸出的任何一個字段,你可以在PHP級別劃分,使用爆炸或者其他的東西。

2

Solr只能維護數據的'平面'表示。你想要做的並不是真的可能。有許多解決方法,例如使用dynamic fields 和使用solr join鏈接多個數據集。

0

試着用索引時間塊連接4.8來檢索像這樣的結果。但是,這是爲了加入父母的孩子文件。否則,您需要使用上述推薦的字符串連接解決方​​案。

相關問題