C# 创建Lucene.net自定义分析器

C# 创建Lucene.net自定义分析器,c#,lucene,lucene.net,analyzer,C#,Lucene,Lucene.net,Analyzer,我正试图在Lucene.net 4.8中创建一个自定义分析器-但是我遇到了一个无法理解的错误 我的分析器代码: public class SynonymAnalyzer : Analyzer { protected override TokenStreamComponents CreateComponents(string fieldName, TextReader reader) { String base1 = "lawnmower"; String syn1 = "l

我正试图在Lucene.net 4.8中创建一个自定义分析器-但是我遇到了一个无法理解的错误

我的分析器代码:

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行失败,并出现以下错误:

令牌流协定冲突:Reset()/Dispose()调用丢失,Reset()调用多次,或者子类未调用base.Reset()。有关正确的消费工作流的更多信息,请参阅TokenStream类的Javadocs


我不知道我哪里出了问题

问题在于,您的TokenStreamComponents是使用与结果TokenStream中使用的不同的标记器构建的。将其更改为此应该可以解决此问题:

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