1.6. アナライザ
次にもう少し面白いことをしてみましょう。インデックス化された書籍タイトルのいずれかが "Refactoring: Improving the Design of Existing Code" であり、"refactor"、"refactors"、"refactored"、および "refactoring" のすべてのクエリでヒットしたいとします。Lucene では、これはインデックス作成中と検索処理中にワードステミングを適用するアナライザクラスを選択して実現できます。Hibernate Search は、使用するアナライザを設定する複数の方法を提供します (「アナライザ」 を参照)。
- 設定ファイルでの
hibernate.search.analyzerプロパティの設定。指定されたクラスはデフォルトのアナライザです。 - エンティティレベルでの
アノテーションの設定。@Analyzer - フィールドレベルでの
@アノテーションの設定。Analyzer
@Analyzer アノテーションを使用する場合は、使用するアナライザの完全修飾クラス名を指定したり、@AnalyzerDef アノテーションにより定義されたアナライザ定義を参照したりできます。アナライザ定義を参照する場合は、ファクトリを使用する Solr アナライザフレームワークが使用されます。利用可能なファクトリクラスの詳細については、Solr JavaDoc または Solr Wiki の対応するセクションを参照してください。選択されたファクトリに応じて、Solr 依存関係の上部に追加のライブラリが必要になることがあります。たとえば、PhoneticFilterFactory は commons-codec に依存します。
以下の例では、
StandardTokenizerFactory が使用され、その後に LowerCaseFilterFactory と SnowballPorterFilterFactory の 2 つのフィルタファクトリが続きます。標準的なトークナイザは単語を句読点とハイフンで分割します (電子メールアドレスとインターネットホスト名はそのまま保持されます)。これは優れた汎用的なトークナイザです。小文字のフィルタは各トークンの文字を小文字にし、スノーボールフィルタは言語固有のステミングを適用します。
一般的に、Solr フレームワークを使用する場合は、最初にトークナイザを使用し、次に任意の数のフィルタを使用する必要があります。
例1.10 @AnalyzerDef および Solr フレームワークを使用してアナライザを定義および使用
package example; ... @Entity @Indexed @AnalyzerDef(name = "customanalyzer", tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class), filters = { @TokenFilterDef(factory = LowerCaseFilterFactory.class), @TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = { @Parameter(name = "language", value = "English") }) }) public class Book { @Id @GeneratedValue @DocumentId private Integer id; @Field(index=Index.TOKENIZED, store=Store.NO) @Analyzer(definition = "customanalyzer") private String title; @Field(index=Index.TOKENIZED, store=Store.NO) @Analyzer(definition = "customanalyzer") private String subtitle; @IndexedEmbedded @ManyToMany private Set<Author> authors = new HashSet<Author>(); @Field(index = Index.UN_TOKENIZED, store = Store.YES) @DateBridge(resolution = Resolution.DAY) private Date publicationDate; public Book() { } // standard getters/setters follow here ... }