java - Java 全文搜索解决方案?

标签 java full-text-search nosql full-text-indexing

有大量不同类型的实体:

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() 。我对性能有一些疑问:构建索引通常是一项相当昂贵的操作,所以我不确定它是否有帮助。

您还有其他建议吗?

澄清细节:

  1. Set<Entity> entities = ...约有 10000 件商品。
  2. Set<Entity> entities = ...不是从数据库读取的,所以我不能只添加 where ...健康)状况。数据源非常重要,所以我无法从侧面解决问题。
  3. Entities应被视为短文章,因此某些字段可能高达 10KB,而其他字段可能约为 10 字节。
  4. 我需要经常执行此搜索,但查询字符串和原始集每次都不同,所以看起来我不能只构建一次索引(因为实体集每次都不同)。

最佳答案

对于如此复杂的对象域,您可以使用 lucene 包装工具,如 Compass它允许使用与 ORM 相同的方法(如 hibernate)快速将对象图映射到 lucene 索引

关于java - Java 全文搜索解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7544762/

相关文章:

php - MYSQL全文搜索关键字有空格匹配名称没有空格的列

php - Redis 时间序列数据和时区

java - 标记语法错误,错误放置的结构

JavaFX HTML 节点元素

java - Java中的鼠标事件

mysql - 使用连接列的 Match() Against()

php - 是否可以使用 Propel2 进行全文(匹配)查询?

node.js - NodeJS Mongo - Mongoose - 动态集合名称

nosql - Vespa 与其他 no-sql 数据库

java - 使用foreach循环构造数组中的对象