2011-09-25 118 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)

相关问题