C#Lucene.Net拼写检查器

时间:2013-05-16 11:26:35

标签: c# lucene.net spell-checking

我有一个向用户提供数据的网站。我想使用Lucene.Net进行自动完成。问题是我希望能够返回纠正拼写错误的结果。我看到Lucene.Net有一个拼写检查功能,可以提示其他单词。但它返回单词,我需要ID以获得该项目的更多信息。从spellchecker获得结果后,我是否必须对常规索引进行另一次查询,还是有更好的方法?

1 个答案:

答案 0 :(得分:4)

你需要搜索它,它不能这样做,因为拼写检查工作在一个单独的索引上,该索引没有链接到你的主索引你创建的建议。

很容易做到:

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