2

「。」を含むキーワードにインデックスを付けるために何をすべきかを理解しようとしています。。

例:this.name

用語にインデックスを付けたい:これと名前をインデックスに追加します。

StandardAnalyserを使用しています。WhitespaceTokensizerまたはTokenFilterを拡張しようとしましたが、正しい方向に進んでいるかどうかわかりません。

StandardAnalyserを使用する場合、キーワードとして「this.name」を取得します。これは私が望むものではありませんが、アナライザーが残りを正しく実行してくれます。

4

4 に答える 4

7

ピリオドとアンダースコアをスペースに変換するCharFilterをStandardTokenizerの前に置くことができます。MappingCharFilterは機能します。

簡素化されたStandardAnalyzerに追加されたMappingCharFilterは次のとおりです(元の4.1バージョンはこちらを参照)。

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.charfilter.MappingCharFilter;
import org.apache.lucene.analysis.charfilter.NormalizeCharMap;
import org.apache.lucene.analysis.core.LowerCaseFilter;
import org.apache.lucene.analysis.core.StopAnalyzer;
import org.apache.lucene.analysis.core.StopFilter;
import org.apache.lucene.analysis.standard.StandardFilter;
import org.apache.lucene.analysis.standard.StandardTokenizer;
import org.apache.lucene.analysis.util.StopwordAnalyzerBase;
import org.apache.lucene.util.Version;

import java.io.IOException;
import java.io.Reader;

public final class MyAnalyzer extends StopwordAnalyzerBase {
  private int maxTokenLength = 255;
  public MyAnalyzer() {
    super(Version.LUCENE_41, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
  }

  @Override
  protected TokenStreamComponents createComponents
      (final String fieldName, final Reader reader) {
    final StandardTokenizer src = new StandardTokenizer(matchVersion, reader);
    src.setMaxTokenLength(maxTokenLength);
    TokenStream tok = new StandardFilter(matchVersion, src);
    tok = new LowerCaseFilter(matchVersion, tok);
    tok = new StopFilter(matchVersion, tok, stopwords);
    return new TokenStreamComponents(src, tok) {
      @Override
      protected void setReader(final Reader reader) throws IOException {
        src.setMaxTokenLength(MyAnalyzer.this.maxTokenLength);
        super.setReader(reader);
      }
    };
  }

  @Override
  protected Reader initReader(String fieldName, Reader reader) {
    NormalizeCharMap.Builder builder = new NormalizeCharMap.Builder();
    builder.add(".", " ");
    builder.add("_", " ");
    NormalizeCharMap normMap = builder.build();
    return new MappingCharFilter(normMap, reader);
  }
}

これが機能することを実証するための簡単なテストです。

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.BaseTokenStreamTestCase;

public class TestMyAnalyzer extends BaseTokenStreamTestCase {
  private Analyzer analyzer = new MyAnalyzer();

  public void testPeriods() throws Exception {
    BaseTokenStreamTestCase.assertAnalyzesTo
    (analyzer, 
     "this.name; here.i.am; sentences ... end with periods.",
     new String[] { "name", "here", "i", "am", "sentences", "end", "periods" } );
  }

  public void testUnderscores() throws Exception {
    BaseTokenStreamTestCase.assertAnalyzesTo
        (analyzer,
         "some_underscore_term _and____ stuff that is_not in it",
         new String[] { "some", "underscore", "term", "stuff" } );
  }
}
于 2013-03-06T06:51:51.400 に答える
0

私があなたを正しく理解している場合は、ドットを削除するトークナイザーを使用する必要があります。つまり、ドットを含む名前はその時点で分割する必要があります("here.i.am"は"here" + "i"+"になります午前")。

于 2013-03-05T22:23:58.553 に答える
0

ここに記載されている動作に巻き込まれています:

ただし、空白が続かないドットはトークンの一部と見なされます。

StandardTokenizerあなたが探していないかもしれないよりもいくつかのより複雑な構文解析ルールを導入します。これは特に、URL、IP、識別子などのトークン化を防ぐことを目的としています。のように、より単純な実装がニーズに合う場合がありますLetterTokenizer

それが本当にあなたのニーズに合わない場合(そしてそれはお風呂の水で赤ちゃんを捨てることになるかもしれません)、あなたはStandardTokenizer自分自身を修正する必要があるかもしれません、それはLuceneドキュメントによって明示的に奨励されています:

多くのアプリケーションには、特定のトークナイザーのニーズがあります。このトークナイザーがアプリケーションに適していない場合は、このソースコードディレクトリをプロジェクトにコピーして、独自の文法ベースのトークナイザーを維持することを検討してください。

于 2013-03-05T22:41:29.710 に答える
0

Sebastien Dionne:単語を分割する方法がわかりませんでした。ドキュメントの文字を文字ごとに解析する必要がありますか?

Sebastien Dionne:トークンを複数の部分に分割し、それらすべてにインデックスを付ける方法を知りたいです。


カスタムアナライザーを作成する必要がある場合があります。

アナライザーは、Tokenizerと、場合によってはTokenFilterインスタンスのチェーンの組み合わせです。

トークナイザー:おそらくjava.io.Readerとして渡された入力テキストを取り込みます。
テキストを分解するだけです。変更せず、分解するだけです。

TokenFilter:Tokenizerによって発行されたトークンを取り込み、トークンを追加/削除/変更し、すべてが完了するまで同じものを1つずつ発行します。

要件に基づいてトークンを複数のトークンに置き換えると、すべてをバッファリングし、それらを1つずつインデクサーに送信します。

次のリソースを確認できますが、残念ながら、トライアルメンバーシップにサインアップする必要がある場合があります。

カスタムアナライザーを作成することにより、テキストを希望どおりに分類できます。LowercaseFilterなどの既存のコンポーネントを使用することもできます。幸い、Luceneを使用すると、組み込みまたはWebでそれを見つけることができなかった場合に、目的に役立つアナライザーを考え出すことができます。

カスタムフィルターの作成:アクション2のLucene

于 2013-03-06T02:49:31.500 に答える