2010-04-29 432 views
1

基本上我有非常簡單的數據庫,我想用Lucene索引。 域是:Lucene複雜結構搜索

// Person domain 
class Person { 
    Set<Pair> keys; 
} 

// Pair domain 
class Pair { 
    KeyItem keyItem; 
    String value; 
} 

// KeyItem domain, name is unique field within the DB (!!) 
class KeyItem{ 
    String name; 
} 

我有幾千萬型材和億萬雙,然而,由於大多數KeyItem的「名稱」字段重複的,只有幾十KeyItem實例。 達到該結構以保存KeyItem實例。

基本上任何字段的任何配置文件都可以保存到該結構中。 可以說,我們已經與性能

- name: Andrew Morton 
- eduction: University of New South Wales, 
- country: Australia, 
- occupation: Linux programmer. 

要保存其個人信息,我們將有一個檔案例如,4種KeyItem情況:姓名,教育,國家和職業,以及價值4個實例:「安德魯·莫頓「,」新南威爾士大學「,」澳大利亞「和」Linux程序員「。

所有其他配置文件將引用(全部或部分)KeyItem的相同實例:名稱,教育,國家和職業。

我的問題是,如何索引所有這些,以便我可以搜索配置文件中的KeyItem :: name和Pair :: value的某些特定值。理想情況下,我想那種查詢的工作:

名字:安德魯*和職業:Linux *的

我應該創建自定義的索引和搜索器?或者我可以使用標準的,只是以某種方式將KeyItem和Pair映射爲Lucene組件?

回答

3

我相信你可以使用標準的Lucene方法。 我會:

  • 將每個配置文件轉換爲Lucene文檔。
  • 將每個配對轉換爲本文檔中的字段。所有字段都需要進行索引,但不一定要存儲。
  • 將包含配置文件ID的存儲字段添加到文檔。
  • 使用名稱:值的搜索與您的示例類似。

如果您選擇裸露的Lucene,您將需要一個自定義索引器和搜索器,但它們並不難構建。 您可能更容易使用Solr,您需要的編程較少。但是,我不知道Solr是否允許像我描述的開放式模式 - 我相信你必須預定義所有字段名稱,所以這可能會阻止你使用Solr。

+0

我在Grails項目中使用了Compass插件。我只是想知道是否可以使用標準的Compass註釋或XML定義。我想要儘可能少的代碼。 – Archer 2010-04-29 17:37:46

1

Lucene基本上基於關鍵字/ s的出現而返回命中文檔的列表,而不管查詢的類型如何。基本細分讀者檢查整個索引數據庫中是否存在關鍵詞,而不是檢索特定領域的關鍵詞。

建議引入執行以下操作的自定義搜索器。

1.使用文檔ID閱讀列入清單的文檔。 (我猜可能會覆蓋collect()方法來傳遞來自IndexSearcher類的search()的文檔ID)。
2.獲取字段值並檢查預期關鍵字的存在。
3.僅當文檔符合您的自定義標準時纔將文檔記入評分。

注意:可以修改默認的標準搜索器,而不是從頭開始編寫自定義的seacher。