有大量不同类型的实体:
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
接口(interface)有一个方法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 来构建索引。我所说的索引是指内容 -> id 映射。内容只是我正在考虑的所有领域的一个微不足道的“总和”。所以,对于Entity1
内容将是 field1()
的串联和field2()
。我对性能有一些疑问:构建索引通常是一项相当昂贵的操作,所以我不确定它是否有帮助。
您还有其他建议吗?
澄清细节:
-
Set<Entity> entities = ...
约有 10000 件商品。 -
Set<Entity> entities = ...
不是从数据库读取的,所以我不能只添加where ...
健康)状况。数据源非常重要,所以我无法从侧面解决问题。 -
Entities
应被视为短文章,因此某些字段可能高达 10KB,而其他字段可能约为 10 字节。 - 我需要经常执行此搜索,但查询字符串和原始集每次都不同,所以看起来我不能只构建一次索引(因为实体集每次都不同)。里>
最佳答案
对于如此复杂的对象域,您可以使用 lucene 包装工具,如 Compass它允许使用与 ORM 相同的方法(如 hibernate)快速将对象图映射到 lucene 索引
关于java - Java 全文搜索解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7544762/