0

エンティティとテーブルがProductあり、その名前の上に異なるキーワードで製品を検索できるデータベース設計が必要です。つまり、シソーラスを使用するように、製品名「HDR-TD20V」はキーワード「camcorder」でも検索する必要があります。 、「camera」、「video camera」など。これと同じメカニズムを使用して、異なる入力言語から同じレコードを見つけることができることに注意してください。たとえば、「camara de video」(スペイン語) または「videokamera」(ドイツ語) を検索すると、同じレコードが検索されます。同じレコード。

Hibernate-search 、つまり Lucene を使用していると仮定すると、次の 2 つの設計上の選択肢があります。

  1. 非正規化アプローチ:Productテーブルには、keywordsその製品のカンマ区切りのキーワードを含む列があります。これは明らかに第 1 正規形に違反しています。ただし、これは 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このマテリアライズドビューにインデックスを付けない限り。

私はもちろん選択肢 2 を好みますが、Hibernate-search がこのユースケースをどのように最適にカバーするかはわかりません。

4

1 に答える 1

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 マッピングがどのように見えるかは、ユーザー ケースによって異なります。

于 2013-02-07T12:03:38.477 に答える