在这种情况下,我怎样才能最好地应用Hibernate-Search?

时间:2013-02-04 19:24:40

标签: java database database-design lucene hibernate-search

我有一个Product实体和表格,并希望数据库设计允许在其名称之上通过不同的关键字查找产品,即使用同义词库,例如产品名称“HDR-TD20V”也应该通过关键词“camcorder”,“camera”,“video camera”等找到。注意,这些相同的机制可用于从不同的输入语言中找到相同的记录,例如寻找“camara de video”(西班牙语)或“videokamera”(德语)也应该找到相同的记录。

假设我正在使用Hibernate搜索,即Lucene我有以下两种设计选择:

  1. 反规范化方法Product表格的keywords列包含该产品的逗号分隔关键字。这显然违反了First Normal Form“......每个属性的值只包含该域中的一个值。”但是,这将很好地与Hibernate-search集成。
  2. 规范化方法:定义Keyword实体表即Keyword(id,keyword,languageId)和多对多关联ProductKeyword(productId,keywordId),但与Hibernate-Search的集成不是如此直观......除非例如我创建了一个物化视图,即select * from Product p, Keyword k, ProductKeyword pk where p.id=pk.productId and k.id=pk.keywordId,并为此物化视图编制索引。
  3. 我当然更喜欢选择2,但我不确定Hibernate-search如何最佳地覆盖这个用例。

1 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

@Indexed
public class Product {
    @Id
    private long id;

    @ManyToMany
    @IndexedEmbedded
    Set<Keyword> keywords;

    // ...
}

public class Keyword {

    @Id
    private long id;

    // only needed if you want a bidirectional relation
    @ManyToMany
    @ContainedIn
    Set<Product> products;

    // ...
}

我遗漏了延迟加载的选项等.JPA映射的确切外观取决于用户案例