2014-05-11 72 views
7

我使用Apache Solr實現我的web應用程序的匹配功能,並且我遇到這種情況的一個問題:Solr的查詢匹配嵌套/關係型數據

我有三個程序員,技能領域是他們的技能, 「重量」是指技能有多好,他/她:

{ 
    name: "John", 
    skill: [ 
     {name: "java", weight: 90}, 
     {name: "oracle", weight: 90}, 
     {name: "linux", weight: 70} 
    ] 
}, 
{ 
    name: "Sam", 
    skill: [ 
     {name: "C#", weight: 98}, 
     {name: "java", weight: 75}, 
     {name: "oracle", weight: 70}, 
     {name: "tomcat", weight: 70}, 
    ] 
}, 
{ 
    name: "Bob", 
    skill: [ 
     {name: "oracle", weight: 90}, 
     {name: "java", weight: 85} 
    ] 
} 

,我有一個求職的程序員:

{ 
    name: "webapp development", 
    skillRequired: [ 
     {name: "java", weight: 85}, 
     {name: "oracle", weight: 85}, 
    ] 
} 

我想用工作的「skillRequired」匹配那些程序員(找到最適合這份工作的人)。在這種情況下,應該是John和Bob,Sam因爲他的java和oracle技能不夠好而被踢掉了。約翰得分高於鮑勃,因爲他更瞭解甲骨文。

問題是,Solr的不能嵌套索引對象,我想我能得到最好的格式是:

name: "John", 
skill-name: ["java", "oracle", "linux"], 
skill-weight: [90, 90, 70] 

等。所以我不知道是否可以構建一個查詢來獲得這個場景的工作。

有更好的模式結構嗎?或使用索引/查詢時間提升?

我幾乎讀了幾乎所有的solr wiki和google都沒有運氣,歡迎提供任何提示和解決方法。

問題解決了,在這裏我登錄解決方案的幫助:

月1日,我的數據格式是JSON,所以我需要Solr的-4.8.0與JSON支持指數嵌套數據。如果數據是xml格式,solr-4.7.2仍然有效。

2,Solr的-4.8.0需要java7-U55(官方推薦)

3,嵌套的文件/對象應提交與 「childDocuments」 鍵SOLR。爲了識別父/子文檔的類型,我添加了「type」字段。所以用上面的例子,似乎是這樣的:

{ 
     type: "programmer", 
     name: "John", 
     _childDocuments_: [ 
      {type:"skill", name: "java", weight: 90}, 
      {type:"skill", name: "oracle", weight: 90}, 
      {type:"skill", name: "linux", weight: 70} 
     ] 
    }, 
    { 
     type: "programmer", 
     name: "Sam", 
     _childDocuments_: [ 
      {type:"skill",name: "C#", weight: 98}, 
      {type:"skill", name: "java", weight: 75}, 
      {type:"skill", name: "oracle", weight: 70}, 
      {type:"skill", name: "tomcat", weight: 70}, 
     ] 
    }, 
    { 
     type: "programmer", 
     name: "Bob", 
     _childDocuments_: [ 
      {type:"skill", name: "oracle", weight: 90}, 
      {type:"skill", name: "java", weight: 85} 
     ] 
    } 

4,提交後並提交到Solr,我可以匹配塊的工作連接(過濾器查詢)查詢:

fq={!parent which='type:programmer'}type:skill AND name:java AND weight:[85 TO *]& 
fq={!parent which='type:programmer'}type:skill AND name:oracle AND weight:[85 TO *] 
+1

請問您能否爲這個特殊情況提供schema.xml? – frankie

+0

您是否必須將_ root _字段添加到您的模式中?我遵循http://yonik.com/solr-nested-objects/的指導方針,在添加嵌套文檔之前,我必須更新模式:$ curl http:// localhost:8983/solr/nested_demo/schema -X POST -H'Content-type:application/json'--data-binary'「add-field」:{ 「name」:「_ root _」, 「type」:「string」, 「indexed」:true, 「stored」:false } }' – alisa

+0

您能否提供架構?你是如何在模式中聲明這個字段的? –

回答

3

你可以嘗試BlockJoinQuery。 Refer here

+1

不錯!非常有用的線索!我發現它終於解決了我的問題:http://heliosearch.org/solr-4-8-features/ –

+1

該網站無法訪問!你能否更新你的答案? @HetfieldJoe –

+0

@TimLong鏈接適合我。 Plz再試一次。你也可以谷歌塊加入查詢。另一個資源是http://yonik.com/solr-nested-objects/ – sidgate