2011-09-25 76 views
2

有一大套不同類型的實體:Java的全文搜索解決方案?

interface Entity { 
} 

interface Entity1 extends Entity { 
    String field1(); 
    String field2(); 
} 

interface Entity2 extends Entity { 
    String field1(); 
    String field2(); 
    String field3(); 
} 

interface Entity3 extends Entity { 
    String field12(); 
    String field23(); 
    String field34(); 
} 

Set<Entity> entities = ... 

的任務是落實這套全文搜索。通過全文搜索我的意思是我只需要獲得包含我正在尋找的子字符串的實體(我不需要需要知道確切的屬性,該子字符串的位置的確切偏移量等)。在當前實施Entity接口有一個方法matches(String)

interface Entity { 
    boolean matches(String text); 
} 

每個實體類實現它取決於它的內部:

class Entity1Impl implements Entity1 { 
    public String field1() {...} 
    public String field2() {...} 

    public boolean matches(String text) { 
    return field1().toLowerCase().contains(text.toLowerCase()) || 
      field2().toLowerCase().contains(text.toLowerCase()); 
    } 
} 

我相信這種做法實在是可怕的(雖然,它的工作原理)。我正在考慮在每次有新的集合時使用Lucene建立索引。通過索引我的意思是內容 - >編號映射。內容僅僅是我正在考慮的所有領域的一個微不足道的「總和」。因此,對於Entity1,內容將是field1()field2()的串聯。我對這個表現有些懷疑:建立索引通常是一項非常昂貴的操作,所以我不確定它是否有幫助。

您有任何其他建議嗎?

澄清細節:

  1. Set<Entity> entities = ...是〜10000項。
  2. Set<Entity> entities = ...不是從數據庫中讀取的,所以我不能僅僅添加where ...條件。數據源非常不平凡,所以我無法解決問題。
  3. Entities應該被認爲是短篇文章,所以一些字段可能高達10KB,而其他字段可能高達10字節。
  4. 我需要經常執行此搜索,但查詢字符串和原始集合每次都是不同的,所以它看起來像我不能只建立一次索引(因爲實體的集合每次都不相同)。
+2

它從你的澄清似乎對象圖Lucene索引Compass每搜索有一組獨立的實體進行搜索。是對的嗎?如果是這樣,任何索引方法都是浪費時間。如果從一次搜索到下一次搜索的實體之間存在某種關係,那麼您可以考慮採用增量索引方案。 –

回答

1

對於這樣一個複雜的對象域,您可以使用Lucene的包裝工具等,其允許快速的地圖你使用相同的方法,ORM(如Hibernate)

相關問題