2017-11-10 4 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); 
} 
} 

내 코드입니다 : 내 코드를 실행하면 그러나 다음과 같은 오류와 함께 writer.UpdateDocument 줄에 실패

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(); 

:

TokenStream 계약 위반 : Reset missing()/Dispose() 여러 번 호출 된 Reset 누락 또는 Reset()이 여러 번 호출되거나 c 모든 base.Reset(). 정확한 소비 작업 흐름에 대한 자세한 내용은 TokenStream 클래스의 Javadocs를 참조하십시오.

내가 어디로 잘못 가고 있는지 알 수 없습니까?

답변

2

TokenStreamComponents가 결과 TokenStream에서 사용 된 Tokenizer와 다른 Tokenizer로 생성되는 것이 문제입니다. 이 값으로 변경하면 문제가 해결됩니다.

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