2017-11-10 22 views
3

Lucene.net 4.8でカスタム・アナライザを作成しようとしていますが、私は推測できないエラーに遭遇しています。Lucene.netカスタム・アナライザの作成

マイアナライザコード:

public class SynonymAnalyzer : Analyzer 
{ 

protected override TokenStreamComponents CreateComponents(string fieldName, TextReader reader) 
{ 
    String base1 = "lawnmower"; 
    String syn1 = "lawn mower"; 
    String base2 = "spanner"; 
    String syn2 = "wrench"; 

    SynonymMap.Builder sb = new SynonymMap.Builder(true); 
    sb.Add(new CharsRef(base1), new CharsRef(syn1), true); 
    sb.Add(new CharsRef(base2), new CharsRef(syn2), true); 
    SynonymMap smap = sb.Build(); 

    Tokenizer tokenizer = new StandardTokenizer(Version.LUCENE_48, reader); 

    TokenStream result = new StandardTokenizer(Version.LUCENE_48, reader); 
    result = new SynonymFilter(result, smap, true); 
    return new TokenStreamComponents(tokenizer, result); 
} 
} 

インデックスを構築するための私のコードは次のとおりです。私は自分のコードを実行したときに

var fordFiesta = new Document(); 
fordFiesta.Add(new StringField("Id", "1", Field.Store.YES)); 
fordFiesta.Add(new TextField("Make", "Ford", Field.Store.YES)); 
fordFiesta.Add(new TextField("Model", "Fiesta 1.0 Developing", Field.Store.YES)); 
fordFiesta.Add(new TextField("FullText", "lawnmower Ford 1.0 Fiesta Developing spanner", Field.Store.YES)); 

Lucene.Net.Store.Directory directory = FSDirectory.Open(new DirectoryInfo(Environment.CurrentDirectory + "\\LuceneIndex")); 

SynonymAnalyzer analyzer = new SynonymAnalyzer(); 

var config = new IndexWriterConfig(Version.LUCENE_48, analyzer); 
var writer = new IndexWriter(directory, config); 

writer.UpdateDocument(new Term("Id", "1"), fordFiesta); 

writer.Flush(true, true); 
writer.Commit(); 
writer.Dispose(); 

は、しかし、それは次のエラーでwriter.UpdateDocumentラインで失敗します。

TokenStream契約違反:Reset Missing、Reset()が複数回呼び出された、またはサブクラスがcでないすべてのbase.Reset()。正しい消費ワークフローの詳細については、TokenStreamクラスのJavadocsを参照してください。

どこが間違っているのか分かりませんか?

答えて

2

問題は、TokenStreamComponentsが、結果TokenStreamで使用されているものとは異なるTokenizerで構築されていることです。これに変更すると問題を解決できます:

Tokenizer tokenizer = new StandardTokenizer(Version.LUCENE_48, reader); 
TokenStream result = new SynonymFilter(tokenizer, smap, true); 
return new TokenStreamComponents(tokenizer, result); 
関連する問題