2012-04-06 8 views
0

私は、luceneを使用して320万レコードのRDBMS SQLクエリ結果をテキストファイルに保存して検索します。 [私はここに例を見how to integrate RAMDirectory into FSDirectory in luceneハードディスク上のテキストファイルにluceneを介してRDBMSテーブルデータを格納

[1]:​​.Iはどのようにこのコードをフォーマットするために私のため

public class lucetest { 
     public static void main(String args[]) { 
      lucetest lucetestObj = new lucetest(); 
      lucetestObj.main1(lucetestObj); 
     } 

     public void main1(lucetest lucetestObj) { 
      final File INDEX_DIR = new File(
        "C:\\Documents and Settings\\44444\\workspace\\lucenbase\\bin\\org\\lucenesample\\index"); 

      try { 
       Connection conn; 
       Class.forName("com.teradata.jdbc.TeraDriver").newInstance(); 
       conn = DriverManager.getConnection(
         "jdbc:teradata://x.x.x.x/CHARSET=UTF16", "aaa", "bbb"); 
       StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_35); 

//    Directory index = new RAMDirectory(); //To use RAM space 
Directory index = FSDirectory.open(INDEX_DIR); //To use Hard disk,This will not consume RAM 

       IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, 
         analyzer); 
       IndexWriter writer = new IndexWriter(index, config); 

       // IndexWriter writer = new IndexWriter(INDEX_DIR, analyzer, true); 
       System.out.println("Indexing to directory '" + INDEX_DIR + "'..."); 

       lucetestObj.indexDocs(writer, conn); 
       writer.optimize(); 
       writer.close(); 
       System.out.println("pepsi"); 
       lucetestObj.searchDocs(index, analyzer, "india"); 
       try { 
        conn.close(); 
       } catch (SQLException e2) { 
        // TODO Auto-generated catch block 
        e2.printStackTrace(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 

      } finally { 

      } 

     } 

     void indexDocs(IndexWriter writer, Connection conn) throws Exception { 
      String sql = "select id, name, color from pet"; 

      String queryy = " SELECT CFMASTERNAME, " + " ULTIMATEPARENTID," 
        + "ULTIMATEPARENT, LONG_NAMEE FROM XCUST_SRCH_SRCH" 
        + "sample 100000;"; 
      Statement stmt = conn.createStatement(); 
      ResultSet rs = stmt.executeQuery(queryy); 
      int kk = 0; 
      while (rs.next()) { 
       Document d = new Document(); 
       d.add(new Field("id", rs.getString("CFMASTERID"), Field.Store.YES, 
         Field.Index.NO)); 
       d.add(new Field("name", rs.getString("CFMASTERNAME"), 
         Field.Store.YES, Field.Index.ANALYZED)); 
       d.add(new Field("color", rs.getString("LONG_NAMEE"), 
         Field.Store.YES, Field.Index.ANALYZED)); 
       writer.addDocument(d); 
      } 
      if (rs != null) { 
       rs.close(); 
      } 
     } 

     void searchDocs(Directory index, StandardAnalyzer analyzer, 
       String searchstring) throws Exception { 

      String querystr = searchstring.length() > 0 ? searchstring : "lucene"; 
      Query q = new QueryParser(Version.LUCENE_35, "name", analyzer) 
        .parse(querystr); 

      int hitsPerPage = 10; 
      IndexReader reader = IndexReader.open(index); 
      IndexSearcher searcher = new IndexSearcher(reader); 
      TopScoreDocCollector collector = TopScoreDocCollector.create(
        hitsPerPage, true); 
      searcher.search(q, collector); 
      ScoreDoc[] hits = collector.topDocs().scoreDocs; 
      System.out.println("Found " + hits.length + " hits."); 
      for (int i = 0; i < hits.length; ++i) { 
       int docId = hits[i].doc; 
       Document d = searcher.doc(docId); 
       System.out.println((i + 1) + ".CFMASTERNAME " + d.get("name") 
         + " ****LONG_NAMEE**" + d.get("color") + "****ID******" 
         + d.get("id")); 
      } 

      searcher.close(); 
     } 
    } 

を働いているコードのこの部分を持っているので、代わりにRAMディレクトリのSQL結果テーブルは、指定されたパスでハードディスクに保存されます。私は解決策を解決することができません。私の要件は、luceneを介してディスクに格納されているこのテーブルのデータが非常にfast.Hence私はluceneインデックスされた。

答えて

1
Directory index = FSDirectory.open(INDEX_DIR); 

sql結果をテキストファイルに保存することは記載されていますが、これは不要なオーバーヘッドです。 ResultSetを反復処理するときに、行をLuceneインデックスに直接保存します。

これは重要なことではありませんが、すべての大文字でローカル変数(最終的なものかそれ以外のものか)の命名は規約に反します。 camelCaseを使用します。すべての大文字は、クラスレベルの定数(クラスの静的最終メンバー)の場合にのみ使用されます。

+0

こんにちはマーク、ディレクトリのインデックスはどこですか= FSDirectory.open(INDEX_DIR);コードに入れてください。説明してください。 – hirentshah

+0

あなたのコードに既にDirectory index = ...がある場所。ちょうど右側を交換してください。 –

+0

これはうまくいきました。Markoさん大変ありがとうございます。パスに複数のファイルが作成されています。クエリは1秒以内に結果を返しています。インデックスを付けるフィールドと見つからないフィールドを探しています。クエリーおよび単一フィールドクエリーを使用してルシーン検索を行い、うまく機能します。 – hirentshah