web-dev-qa-db-ja.com

Luceneアナライザーの比較

Lucene内のさまざまなアナライザーの違いを誰かが説明できますか? maxClauseCount例外が発生し、KeywordAnalyzerを使用してこれを回避できることを理解していますが、アナライザーを取り巻く問題を理解せずにStandardAnalyzerから変更したくありません。どうもありがとう。

105
Journeyman

一般に、Luceneのアナライザーは、トークナイザー+ステマー+ストップワードフィルターです。

Tokenizerはテキストをチャンクに分割し、異なるアナライザーが異なるトークナイザーを使用する可能性があるため、異なる出力tokenストリームを取得できます、つまりテキストのチャンクのシーケンス。たとえば、あなたが言ったKeywordAnalyzerはテキストをまったく分割せず、すべてのフィールドを単一のトークンとして受け取ります。同時に、StandardAnalyzer(および他のほとんどのアナライザー)は、スペースと句読点を分割ポイントとして使用します。たとえば、「I am very happy」というフレーズの場合、リスト["i"、 "am"、 "very"、 "happy"](またはそのようなもの)が生成されます。特定のアナライザー/トケナイザーの詳細については、その Java Docs を参照してください。

Stemmersは、問題のWordのベースを取得するために使用されます。使用する言語に大きく依存します。たとえば、以前の英語のフレーズには["i"、 "be"、 "veri"、 "happi"]のようなものがあり、フランス語の "Je suistrèsheureux"のようなフランス語のアナライザー( SnowballAnalyzer 、 "French"で初期化)は、["je"、 "être"、 "tre"、 "heur"]を生成します。もちろん、ある言語のアナライザーを使用して別の言語のテキストをステミングすると、他の言語のルールが使用され、ステマーが誤った結果を生成する可能性があります。すべてのシステムで失敗するわけではありませんが、検索結果の精度が低下する可能性があります。

KeywordAnalyzerはステマーを使用せず、すべてのフィールドを変更せずに渡します。したがって、英語のテキストでいくつかの単語を検索する場合、このアナライザーを使用することはお勧めできません。

ストップワードは、最も頻繁に使用されるほとんど役に立たない単語です。繰り返しますが、それは言語に大きく依存しています。英語の場合、これらの単語は「a」、「the」、「I」、「be」、「have」などです。ストップワードフィルターは、トークンストリームからそれらを削除して、検索結果のノイズを低減します。 StandardAnalyzerとの「非常に満足」は、リスト["veri"、 "happi"]に変換されます。

そして、KeywordAnalyzerは再び何もしません。したがって、KeywordAnalyzerはIDや電話番号などに使用されますが、通常のテキストには使用されません。

また、maxClauseCount例外については、検索で取得できると思います。この場合、おそらく検索クエリが複雑すぎるためです。複数のクエリに分割するか、より低レベルの関数を使用してください。

207
ffriend

私の観点では、StandAnalyzerSmartCNAnalyzerを使用しました。中国語でテキストを検索する必要があるので。明らかに、SmartCnAnalyzerは中国語の処理に優れています。さまざまな目的のために、あなたは適切なアナライザーを選択する必要があります。

0
neal