1

ユーザーにデータを提供するサイトがあります。オートコンプリートに Lucene.Net を使用したいと考えています。問題は、スペル ミスを修正する結果を返せるようにしたいということです。Lucene.Net には、他の単語を提案するスペルチェッカー機能があることがわかりました。しかし、それは単語を返します。そのアイテムの詳細情報を取得するには、ID が必要です。スペルチェッカーから結果を取得した後、通常のインデックスで別のクエリを実行する必要がありますか、それとももっと良い方法がありますか?

4

1 に答える 1

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();
于 2013-05-16T15:02:22.990 に答える