3

次のように、Lucene で StandardAnalyzer を使用してテキスト文字列のインデックスを作成している状況があります。

public void indexText(String suffix, boolean includeStopWords)  {        
    StandardAnalyzer analyzer = null;


    if (includeStopWords) {
        analyzer = new StandardAnalyzer(Version.LUCENE_30);
    }
    else {

        // Get Stop_Words to exclude them.
        Set<String> stopWords = (Set<String>) Stop_Word_Listener.getStopWords();      
        analyzer = new StandardAnalyzer(Version.LUCENE_30, stopWords);
    }

    try {

        // Index text.
        Directory index = new RAMDirectory();
        IndexWriter w = new IndexWriter(index, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);            
        this.addTextToIndex(w, this.getTextToIndex());
        w.close();

        // Read index.
        IndexReader ir = IndexReader.open(index);
        Text_TermVectorMapper ttvm = new Text_TermVectorMapper();

        int docId = 0;

        ir.getTermFreqVector(docId, PropertiesFile.getProperty(text), ttvm);

        // Set output.
        this.setWordFrequencies(ttvm.getWordFrequencies());
        w.close();
    }
    catch(Exception ex) {
        logger.error("Error message\n", ex);
    }
}

private void addTextToIndex(IndexWriter w, String value) throws IOException {
    Document doc = new Document();
    doc.add(new Field(text), value, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
    w.addDocument(doc);
}

これは完全にうまく機能しますが、これを SnowballAnalyzer を使用したステミングと組み合わせたいと思います。

このクラスには、以下のコンストラクターに示されている 2 つのインスタンス変数もあります。

public Text_Indexer(String textToIndex) {
    this.textToIndex = textToIndex;
    this.wordFrequencies = new HashMap<String, Integer>();
}

上記のコードでこれを達成する最善の方法を誰か教えてもらえますか?

ありがとう

モーガンさん。

4

3 に答える 3

2

Lucene は、org.apache.lucene.analysis.Analyzer独自のアナライザーを作成する場合に使用できる基本クラスを提供します。Analyzer を拡張
するクラスを確認できます。org.apache.lucene.analysis.standard.StandardAnalyzer

次に、YourAnalyzer で、次のように、これらのアナライザーが使用するフィルターを使用して、StandardAnalyzer と SnowballAnalyzer をチェーンします。

TokenStream result = new StandardFilter(tokenStream);
result = new SnowballFilter(result, stopSet);

次に、既存のコードで、標準フィルターと Snowball フィルターをチェーンする独自の Analyzer 実装を使用して IndexWriter を構築できるようになります。

完全にオフトピック:
最終的には、リクエストを処理する独自の方法をセットアップする必要があると思います。これは、Solr 内で既に実装されています。

最初に、次のように、SearchComponent を拡張して SolrConfig.xml で定義することにより、独自の検索コンポーネントを作成します。

<searchComponent name="yourQueryComponent" class="org.apache.solr.handler.component.YourQueryComponent"/>

次に、SearchHandler を拡張して検索ハンドラー (要求ハンドラー) を作成し、SolrConfig.xml で定義します。

  <requestHandler name="YourRequestHandlerName" class="org.apache.solr.handler.component.YourRequestHandler" default="true">
    <!-- default values for query parameters -->
        <lst name="defaults">
            <str name="echoParams">explicit</str>       
            <int name="rows">1000</int>
            <str name="fl">*</str>
            <str name="version">2.1</str>
        </lst>

        <arr name="components">
            <str>yourQueryComponent</str>
            <str>facet</str>
            <str>mlt</str>
            <str>highlight</str>            
            <str>stats</str>
            <str>debug</str>

        </arr>

  </requestHandler>

次に、url クエリを Solr に送信するときに、追加のパラメーター qt=YourRequestHandlerName を含めるだけで、その要求に使用される要求ハンドラーになります。

SearchComponents の詳細。
RequestHandler の詳細。

于 2011-03-09T16:41:23.557 に答える
1

Lucene が提供する SnowballAnalyzer は、すでに StandardTokenizer、StandardFilter、LowerCaseFilter、StopFilter、および SnowballFilter を使用しています。したがって、それはまさにあなたが望むことを行うように思えます (StandardAnalyzer が行うすべての機能に加えて、スノーボール ステミング)。

そうでない場合は、任意のトークナイザーと TokenStreams を組み合わせて、独自のアナライザーを非常に簡単に構築できます。

于 2011-03-10T12:37:25.227 に答える
0

最後に、オプションとしてSnowBallAnalyzerを呼び出すようにプログラムコードを再配置しました。次に、出力はStandardAnalyzerを介してインデックス付けされます。

動作し、高速ですが、1つのアナライザーですべてを実行できる場合は、コードを再検討します。

mbonaciとAviに感謝します。

于 2011-03-12T10:31:07.187 に答える