14.2.3.4. 動的アナライザーの選択
現時点で、アナライザーを指定する方法はすべて静的でした。ただし、インデックスを作成するエンティティーの現在の状態 (たとえば多言語アプリケーション) に応じてアナライザーを選択すると便利なユースケースがあります。たとえば、
BlogEntry
クラスの場合、アナライザーはエントリーの言語プロパティーに依存する可能性があります。このプロパティーによっては、実際のテキストにインデックスを付けるために正しい言語固有のスチーマーを選択する必要があります。
この動的アナライザーを有効にするために、Hibernate Search で
AnalyzerDiscriminator
アノテーションが導入されました。例14.23「@AnalyzerDiscriminator の使用法」 このアノテーションの使用法を示します。
例14.23 @AnalyzerDiscriminator の使用法
@Entity @Indexed @AnalyzerDefs({ @AnalyzerDef(name = "en", tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class), filters = { @TokenFilterDef(factory = LowerCaseFilterFactory.class), @TokenFilterDef(factory = EnglishPorterFilterFactory.class ) }), @AnalyzerDef(name = "de", tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class), filters = { @TokenFilterDef(factory = LowerCaseFilterFactory.class), @TokenFilterDef(factory = GermanStemFilterFactory.class) }) }) public class BlogEntry { @Id @GeneratedValue @DocumentId private Integer id; @Field @AnalyzerDiscriminator(impl = LanguageDiscriminator.class) private String language; @Field private String text; private Set<BlogEntry> references; // standard getter/setter ... }
public class LanguageDiscriminator implements Discriminator { public String getAnalyzerDefinitionName(Object value, Object entity, String field) { if ( value == null || !( entity instanceof BlogEntry ) ) { return null; } return (String) value; } }
@AnalyzerDiscriminator
を使用するための前提条件は、動的に使用されるすべてのアナライザーが @AnalyzerDef
定義で事前定義されることです 。このような場合、クラスまたはアナライザーを動的に選択するエンティティーの特定のプロパティーに @AnalyzerDiscriminator
アノテーションを配置することができます。AnalyzerDiscriminator
の impl
パラメーターを使用すると、Discriminator
インターフェースの具体的な実装を指定できます。このインターフェースの実装は、ユーザー自身が提供する必要があります。実装が必要な唯一の方法は getAnalyzerDefinitionName()
で、これは Lucene ドキュメントに追加された各フィールドに対して呼び出されます。インデックスを取得するエンティティーもインターフェースメソッドに渡されます。value
パラメーターは、AnalyzerDiscriminator
がクラスレベルではなくプロパティーレベルに配置されている場合にのみ設定されます。この場合、値はこのプロパティーの現在の値を表します。
Discriminator
インターフェースの実装では、既存のアナライザー定義の名前を返し、デフォルトのアナライザーが上書きされない場合は null
を返します。例14.23「@AnalyzerDiscriminator の使用法」 言語パラメーターは @AnalyzerDef
で指定された名前に一致する 'de' または 'en' であることを仮定しています 。