2011-01-13 4 views
3

これは一般的なJavaの質問と考えることができますが、わかりやすくするためにLuceneを例として使用しています。Luceneがテキストをトークン化するプロセス

Luceneのさまざまなトークナを使用してテキストをトークン化できます。メインの抽象Tokenizerクラスがあり、それを拡張するさまざまなクラスがあります。 TokenFilterの場合と同じです。

これで、ドキュメントのインデックスを作成するたびに、新しいトークナイザが作成されるようです。質問は、Tokeinzerは単なるユーティリティクラスなので、なぜ静的にしないのですか?例えば、すべての文字を小文字に変換するTokenizerは、それが取得するすべての入力に対してのみ行う静的メソッドを持つことができます。インデックスを作成するすべてのテキストの新しいオブジェクトを作成するポイントは何ですか?

Tokeinzerにはトークン化される入力を含むプライベートフィールドがあります。トークン化プロセスが終了し、新しいトークン化されたテキストが返された直後にオブジェクトが破棄されるため、なぜこのように格納する必要があるのか​​わかりません。私が考えることができる唯一のものは多分マルチスレッドアクセスでしょうか?

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

答えて

6

さて、それはあなたがインデックスにドキュメントをするたびに、新しいトークナイザが

これは真実ではありませんが作成されているようだ、Analyzer.reusableTokenStream方法はどの しない再利用し、呼ばれていますTokenizerだけでなく、チェーン全体(TokenFiltersなど) 言及するhttp://lucene.apache.org/java/3_0_0/api/core/org/apache/lucene/analysis/Analyzer.html#reusableTokenStream(java.lang.String、java.io.Readerを)

一つのことを参照してください - Tokeinzerは、それがトークン化する受信入力が含まれているプラ​​イベートフィールドがあります。トークン化プロセスが終了し、新しいトークン化されたテキストが返された直後にオブジェクトが破棄されるため、なぜこのように格納する必要があるのか​​わかりません。私が考えることができる唯一のものは多分マルチスレッドアクセスでしょうか?

前述したように、一連のトークナイザとトークンフィルタはすべてドキュメント間で再利用されます。そのため、すべての属性が再利用されますが、属性がチェーン全体で共有されることに注意することも重要です(たとえば、すべてのTokenizersとTokenFiltersの属性参照が同じインスタンスを指している)。このため、すべての属性をリセットするには、トークナイザのclearAttributes()を呼び出すことが重要です。

例として、Whitespaceトークナイザは、ctor内のTermAttributeへの参照を追加し、LowerCaseFilterでラップして、その識別子にTermAttributeへの参照も追加します。これらのTermAttributesは両方とも、同じ根底にあるchar []を指しています。新しいドキュメントが処理されると、Analyzer.reusableTokenStreamが呼び出され、前のドキュメントで使用されたものと同じTokenStreamチェーン(この場合は空白がLowerCaseFilterでラップされます)が返されます。 reset(Reader)メソッドが呼び出され、トークナイザの入力が新しいドキュメントの内容にリセットされます。最後に、reset()がストリーム全体で呼び出され、内部の状態が前のドキュメントからリセットされ、contentsToken()がfalseを返すまで内容が処理されます。

+0

ありがとうございました。これは今、多くの意味があります。 – user431336

0

Luceneがあるドキュメントのインデックス作成のような複雑な作業をするときに、クラスのインスタンスを作成する心配はありません。おそらく、トークン化と索引付けプロセスの中でたくさんのオブジェクトが作成されるでしょう。プロセスが完了したときに廃棄されたオブジェクトからの残量を比較すると、もう1つのトークナイザインスタンスが文字通り何もありません。あなたがプロファイルを取得し、オブジェクトの作成回数を監視すると私は信じていない場合。

関連する問題