2014-10-09 36 views
2

的集合我有一個Java模型是這樣的(某些字段省略):Lucene的文檔結構正確組鍵

@Searchable(root=true) 
class Person { 
    @SearchableProperty 
    String sex; 

    @SearchableProperty 
    String name; 
} 

class Parent extends Person { 
    @SearchableComponent 
    List<Person> children; 
} 

這個模型創建一個Lucene文檔與人阿納金以下數據:

$/person/sex:male 
$/person/name:anakin 
$/person/children/sex:male 
$/person/children/name:luke 
$/person/children/sex:female 
$/person/children/name:leia 

假設這只是許多文件之一,我可以搜索這樣的:

  1. 查找PE有一個名字rsons開始的,有一個男孩

    $/person/name:an* AND $/person/children/sex:male 
    
  2. 找到了男孩和女童的人

    $/person/children/sex:male AND $/person/children/sex:female 
    

我試圖找到一個孩子時遇到麻煩與具體的名稱和性別,像這樣

$/person/children/sex:male AND $/person/children/name:leia 

這將返回一個結果,我可以看到爲什麼。我希望這不會返回任何結果。我的問題是如何區分或關聯這些嵌套的屬性,以便我的查詢返回有效的數據?

我已經考慮:

  1. 存放兒童作爲單獨的文件,但通過這樣做我失去了我上面寫的方式進行搜索的能力。

  2. 在查詢中以某種方式使用id字段來對這些字段進行分組。我無法想出一個「正確」的方式。變我也考慮過:

    $/person/children/1/name:luke 
    $/person/children/name:luke1 or $/person/children/name:1luke 
    

回答

0

我不熟悉的指南針,但對Lucene的水平,你可以使用BlockJoinQuery嵌套子文件到您的父文件,對它們進行查詢。

Mike McCandless在Lucene 3.4中有一篇關於使用BlockJoinQuery的優秀博客文章[1]。這應該給你基本的概念。然而在Lucene 4中,API已經改變,現在正在使用​​包。 Javadoc中有一個代碼示例[2]。

[1] http://blog.mikemccandless.com/2012/01/searching-relational-content-with.html
[2] http://lucene.apache.org/core/4_10_1/join/org/apache/lucene/search/join/package-summary.html

+0

這絕對是正確的答案,但在軟件總是有一個警告。 Compass框架幾乎都是沒有限制的,並且停留在Lucene 2.9版上,所以不幸的是我無法利用這些改進。感謝您的建議! – acanby 2014-10-13 03:46:28

+0

考慮到Compass開發被放棄(作者繼續開發ElasticSearch)你會不會考慮切換堆棧?如果你真的想要註解抽象,那麼Hibernate Search可以和Lucene一起工作http://hibernate.org/search/ – bcoughlan 2014-10-14 14:25:22

+0

絕對是我們正在尋找的東西。我希望在此期間我們可以做些事情來滿足這個要求,但這看起來像是一個死衚衕。謝謝你的幫助! – acanby 2014-10-15 00:57:42