2013-05-16 3 views
1

나는 사용자에게 데이터를 제공하는 사이트가 있습니다. 내 자동 완성을 위해 Lucene.Net을 사용하고 싶습니다. 문제는 맞춤법 오류를 수정 한 결과를 반환 할 수 있기를 바랍니다. Lucene.Net에는 다른 단어를 제안하는 맞춤법 검사 기능이 있습니다. 하지만 그것은 단어를 반환하고 그 항목의 더 많은 정보를 얻기 위해서는 이드가 필요합니다. 맞춤법 검사기에서 결과를 얻은 후에 일반 색인에 대해 다른 검색어를 사용해야합니까, 아니면 더 좋은 방법이 있습니까 ???C# Lucene.Net 맞춤법 검사기

답변

3

맞춤법 검사가 생성 된 제안의 주요 색인에 연결되지 않은 별도의 색인에서 작동하기 때문에 검색 할 필요가 있습니다. 그래도 할

쉬운 :

RAMDirectory dir = new RAMDirectory(); 
IndexWriter iw = new IndexWriter(dir, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED); 

Document d = new Document(); 
Field textField = new Field("text", "", Field.Store.YES, Field.Index.ANALYZED); 
d.Add(textField); 
Field idField = new Field("id", "", Field.Store.YES, Field.Index.NOT_ANALYZED); 
d.Add(idField); 

textField.SetValue("this is a document with a some words"); 
idField.SetValue("42"); 
iw.AddDocument(d); 

iw.Commit(); 
IndexReader reader = iw.GetReader(); 

SpellChecker.Net.Search.Spell.SpellChecker speller = new SpellChecker.Net.Search.Spell.SpellChecker(new RAMDirectory()); 
speller.IndexDictionary(new LuceneDictionary(reader, "text")); 
string [] suggestions = speller.SuggestSimilar("dcument", 5); 


IndexSearcher searcher = new IndexSearcher(reader); 
foreach (string suggestion in suggestions) 
{ 
    TopDocs docs = searcher.Search(new TermQuery(new Term("text", suggestion)), null, Int32.MaxValue); 
    foreach (var doc in docs.ScoreDocs) 
    { 
     Console.WriteLine(searcher.Doc(doc.Doc).Get("id")); 
    } 
} 

reader.Dispose(); 
iw.Dispose(); 
+0

당신의 대답은 재미 있고 쉽게 구현할 보인다. "Lucene.Net.Store.Directory 유형이 참조되지 않은 어셈블리에 정의되어 있습니다."Lucene.Net, Version = 2.0.0.4 어셈블리에 대한 참조를 추가해야합니다. 문화 = 중립, PublicKeyToken = null ' ". 및 " 'Lucene.Net.Store.RAMDirectory'에서 Lucene.Net.Store.Directory ''로 변환 할 수 없습니다. 나는 lucene.net 버전 3.0.3.0을 참조하고있다. 어떤 아이디어? – Gidi

+0

당신이 충돌하는 어셈블리를 참조하는 것처럼 보이면 모든 참조를 제거하고 Lucene.Net 3.0.3 및 Lucene.Net 3.0.3을 가져오고 깨끗한 재 구축을 수행하십시오. Nuget에서 어셈블리를 가져 오는 것이 좋습니다. 난 너겟에서 3.0.3으로 예제를 만들었습니다. –

+0

괜찮습니다. 나는 왜 당신이 "RAMDirectory dir = new RAMDirectory();"를 필요로하는지 이해하지 못한다. 네가 사용하는 걸 못 봤어. 인덱스 디렉토리를 가리켜 야합니까? 나는 이것 같이 그것을 시도하고 빈 결과를 돌려 보냈다. – Gidi