2

複数の名前関連のプロパティ (firstName、lastName、title) を持つ Person エンティティがあります。すべての名前関連のプロパティは、単一の lucene インデックス フィールド「fullName」に格納する必要があります。

@Indexed
@Entity
public class Person {
   ...
   private String firstName;
   private String lastName;
   private String title;

   @Field(store=Store.NO, index=Index.TOKENIZED)
   public String getFullName() {
      return firstName + " " + lastName + " " + title;
   }
}

私が直面している唯一の問題は、名前関連のプロパティが更新されたときにインデックス内の fullName を自動的に更新することです。

fullName が合成フィールドであり、パーツの 1 つが変更されたときに更新する必要があることを Hibernate Search に伝える方法はありますか? たぶん、このようなものですか?

@ComposedOf({"firstName", "lastName", "title"})

ありがとうございました!

4

2 に答える 2

3

問題にはいくつかの解決策があり、選択する解決策はおそらく好みの問題です (それらを組み合わせて適用することもできます)。

  1. プロパティ _hibernate.search. enable_dirty_check_ をチェックし、それがfalseに設定されていることを確認してください。デフォルトはtrueです。詳細については、オンライン ドキュメントを参照してください - http://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/
  2. firstName、lastName、title にも@Fieldアノテーションを追加します。より大きなインデックス サイズが得られますが、多くの場合、それは問題ではありません。副作用として、ダーティチェックが機能します(ところで、JPAアノテーションが正しいと仮定します。たとえば、getFullNameは一時的であると想定しています)
  3. クラス ブリッジを使用し、必要に応じてgetFullNameを削除します。クラスブリッジを使用すると、ダーティチェックの最適化も自動的に無効になります
于 2012-10-16T16:05:16.503 に答える
1
@Indexed
@Entity
public class Person {
   ...
   @Field(name="fullName") String firstName;
   @Field(name="fullName") String lastName;
   @Field(name="fullName") String title;
}

これは、TOKENIZED を選択したため可能であり、トークンを分離するために空白を追加しているため、アナライザーが空白でトークンを分割するように設定されていると想定しています。同じフィールドを複数回繰り返すことができ、結果はほぼ同じです複合用語を分割します (キーワードの特定の順序を検索する PhraseQuery が必要な場合に備えて、用語の順序を決定することはできないため、ほぼ言います)。

より複雑なケースでは、ClassBridgeを使用して、このケースで悩まされていたダーティ チェックの最適化を無効にします。そのようなトリックを検出します。

于 2012-10-16T21:58:36.087 に答える