2012-01-22 8 views
1

行ごとに書き込まれた単語のリスト(230,000語)を含む "fdictionary.txt"ファイル内の検索を検索したいと思います。なぜこのコードがうまくいかないのでしょうか? スペルチェック部が動作していて、リストの長さを1に制限しました。私がしたいのは、fdictionaryを検索することです。その単語がすでにそこにある場合は、スペルチェックをしないでください。マイサーチ機能が動作しません。それは私にエラーを与えることはありません!ここに私が実装したものがあります:luceneでファイルを検索するには

public class SpellCorrection { 

public static File indexDir = new File("/../idxDir"); 

public static void main(String[] args) throws IOException, FileNotFoundException, CorruptIndexException, ParseException { 

    Directory directory = FSDirectory.open(indexDir); 
    SpellChecker spell = new SpellChecker(directory); 

    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_20, null); 
    File dictionary = new File("/../fdictionary00.txt"); 
    spell.indexDictionary(new PlainTextDictionary(dictionary), config, true); 


    String query = "red"; //kne, console 
    String correctedQuery = query; //kne, console 

    if (!search(directory, query)) { 
     String[] suggestions = spell.suggestSimilar(query, 1); 
     if (suggestions != null) {correctedQuery=suggestions[0];} 
    } 

    System.out.println("The Query was: "+query); 
    System.out.println("The Corrected Query is: "+correctedQuery); 
} 

public static boolean search(Directory directory, String queryTerm) throws FileNotFoundException, CorruptIndexException, IOException, ParseException { 
    boolean isIn = false; 

    IndexReader indexReader = IndexReader.open(directory); 
    IndexSearcher indexSearcher = new IndexSearcher(indexReader); 
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_20); 

    Term term = new Term(queryTerm); 
    Query termQuery = new TermQuery(term); 
    TopDocs hits = indexSearcher.search(termQuery, 100); 
    System.out.println(hits.totalHits); 


    if (hits.totalHits > 0) { 
     isIn = true; 
    } 
    return isIn; 
} 
} 
+0

私はあなたの質問が答えられたと信じています。答えの1つを受け入れる – naresh

答えて

1

ここで、fdictionary00.txtからコンテンツのインデックスを作成していますか?

IndexSearcherを使用すると、インデックスがある場合のみ検索できます。 luceneを初めてお使いの方は、いくつかの簡単なチュートリアルを確認してください。 (http://lucenetutorial.com/lucene-in-5-minutes.htmlなど)

+0

ここに:spell.indexDictionary(新しいPlainTextDictionary(辞書)、config、true); – Marcus

+0

あなたはそれを検索するためにデータのインデックスを作成する必要があります。私が与えたリンクをチェックする – naresh

0

インデックスを作成したことはありません。

あなたはセットアップのインデックスに必要...

Directory directory = FSDirectory.open(indexDir); 
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_20); 
IndexWriter writer = new IndexWriter(directory,analyzer,true,IndexWriter.MaxFieldLength.UNLIMITED); 
あなたは、ドキュメントを作成し、分析したフィールドとしてドキュメントにそれぞれの用語を追加する必要が

..

Document doc = new Document(); 
doc.Add(new Field("name", word , Field.Store.YES, Field.Index.ANALYZED)); 

その後追加インデックスへの文書

writer.AddDocument(doc); 

writer.Optimize(); 

ここで、インデックスを作成してインデックスライターを閉じます。

writer.Commit(); 
writer.Close(); 
0

あなたはサービスであなたのSpellCheckerインスタンスが利用できるようにしてspellChecker.exist(word)を使用することができます。

SpellCheckerは2文字以下の単語にはインデックスを付けません。この問題を回避するには、作成後にインデックスに追加できます(SpellChecker.F_WORDフィールドに追加してください)。

ライブインデックスに追加してexist(word)で利用できるようにする場合は、SpellChecker.F_WORDフィールドに追加する必要があります。もちろん、グラム/スタート/エンドなどの他のすべてのフィールドに追加していないので、あなたの単語は、スペルの間違った単語の候補として表示されません。

この場合、ファイルに単語を追加する必要があります。そのため、インデックスを再作成すると、候補として使用できるようになります。プロジェクトがSpellChecker.createDocument(...)をパブリック/パブリックではなくパブリックにした場合、このメソッドは単語を追加することですべてを達成します。

この後、spellChecker.setSpellIndex(directory)に電話する必要があります。

関連する問題