OSDN Git Service

ローカル添付ファイルもApache Luceneを使った全文検索の対象に追加。
authoryuki <kimaira7@gmail.com>
Tue, 13 Aug 2013 09:08:38 +0000 (18:08 +0900)
committeryuki <kimaira7@gmail.com>
Tue, 13 Aug 2013 09:08:38 +0000 (18:08 +0900)
.classpath
src/cx/fbn/nevernote/Global.java
src/cx/fbn/nevernote/NeverNote.java
src/cx/fbn/nevernote/dialog/ConfigDialog.java
src/cx/fbn/nevernote/dialog/ConfigIndexPage.java
src/cx/fbn/nevernote/sql/DatabaseConnection.java
src/cx/fbn/nevernote/sql/NoteResourceTable.java
src/cx/fbn/nevernote/sql/REnSearch.java
src/cx/fbn/nevernote/threads/IndexRunner.java

index 77ad830..7b170d0 100644 (file)
@@ -25,8 +25,9 @@
        <classpathentry kind="lib" path="lib/httpcore-4.1.jar"/>
        <classpathentry kind="lib" path="lib/httpmime-4.1.1.jar"/>
        <classpathentry kind="lib" path="lib/pdfbox-app-1.6.0.jar"/>
-       <classpathentry kind="lib" path="/usr/local/Trolltech/qtjambi-linux32-lgpl-4.5.2_01/qtjambi-4.5.2_01.jar"/>
-       <classpathentry kind="lib" path="/usr/local/Trolltech/qtjambi-linux32-lgpl-4.5.2_01/qtjambi-linux32-gcc-4.5.2_01.jar"/>
-       <classpathentry kind="lib" path="/home/zigzag/workspace/NeighborNote/lib/scribe-1.3.0.jar"/>
+       <classpathentry kind="lib" path="C:/pleiades/workspace/NeighborNote/lib/lucene-core-3.6.2.jar"/>
+       <classpathentry kind="lib" path="C:/pleiades/scribe-1.3.0.jar"/>
+       <classpathentry kind="lib" path="C:/pleiades/qtjambi-win32-lgpl-4.5.2_01/qtjambi-4.5.2_01.jar"/>
+       <classpathentry kind="lib" path="C:/pleiades/qtjambi-win32-lgpl-4.5.2_01/qtjambi-win32-msvc2005-4.5.2_01.jar"/>
        <classpathentry kind="output" path="bin"/>
 </classpath>
index f73ea0a..5b09540 100644 (file)
@@ -53,6 +53,7 @@ import cx.fbn.nevernote.config.StartupConfig;
 import cx.fbn.nevernote.gui.ContainsAttributeFilterTable;
 import cx.fbn.nevernote.gui.DateAttributeFilterTable;
 import cx.fbn.nevernote.gui.ShortcutKeys;
+import cx.fbn.nevernote.sql.DatabaseConnection;
 import cx.fbn.nevernote.sql.driver.NSqlQuery;
 import cx.fbn.nevernote.utilities.ApplicationLogger;
 import cx.fbn.nevernote.utilities.Pair;
@@ -140,7 +141,7 @@ public class Global {
     //public static int minimumWordCount = 2;
     
     // Regular expression to parse text with when indexing
-    private static String wordRegex;
+//    private static String wordRegex;
     
     // Experimental fixes.  Set via Edit/Preferences/Debugging
     public static boolean enableCarriageReturnFix = false;
@@ -222,10 +223,10 @@ public class Global {
                getServer();  // Setup URL to connect to
                
                // Get regular expressions used to parse out words
-               settings.beginGroup("General");
-               String regex = (String) settings.value("regex", "[,\\s]+");
-               setWordRegex(regex);
-               settings.endGroup();
+//             settings.beginGroup("General");
+//             String regex = (String) settings.value("regex", "[,\\s]+");
+//             setWordRegex(regex);
+//             settings.endGroup();
                
                //Setup debugging information
                settings.beginGroup("Debug");
@@ -252,12 +253,12 @@ public class Global {
     }
 
     // Get/Set word parsing regular expression
-    public static String getWordRegex() {
-       return wordRegex;
-    }
-    public static void setWordRegex(String r) {
-       wordRegex = r;
-    }
+//    public static String getWordRegex() {
+//     return wordRegex;
+//    }
+//    public static void setWordRegex(String r) {
+//     wordRegex = r;
+//    }
 
    // Set the debug message level
    public static void setMessageLevel(String msglevel) {
@@ -1881,18 +1882,18 @@ public class Global {
                settings.endGroup();    
     }
     // Get/Set characters that shouldn't be removed from a word
-    public static String getSpecialIndexCharacters() {
-               settings.beginGroup("Index");
-               String text = (String)settings.value("specialCharacters", "");
-               settings.endGroup();    
-               return text;
-    }
-    public static void setSpecialIndexCharacters(String value) {
-               settings.beginGroup("Index");
-               settings.setValue("specialCharacters", value);
-               settings.endGroup();    
-               databaseCache = value;
-    }
+//    public static String getSpecialIndexCharacters() {
+//             settings.beginGroup("Index");
+//             String text = (String)settings.value("specialCharacters", "");
+//             settings.endGroup();    
+//             return text;
+//    }
+//    public static void setSpecialIndexCharacters(String value) {
+//             settings.beginGroup("Index");
+//             settings.setValue("specialCharacters", value);
+//             settings.endGroup();    
+//             databaseCache = value;
+//    }
     
     //*****************************************************************************
     // Control how tag selection behaves (should they be "and" or "or" selections
@@ -2345,7 +2346,8 @@ public class Global {
        }
        
        // 全文検索機能の対象となるテーブルとカラムを再構築
-       public static boolean rebuildFullTextTarget(NSqlQuery query) {
+       public static boolean rebuildFullTextNoteTarget(DatabaseConnection dbConn) {
+               NSqlQuery nQuery = new NSqlQuery(dbConn.getConnection());
                StringBuilder noteTableTarget = new StringBuilder();
                boolean success = true;
                
@@ -2359,12 +2361,30 @@ public class Global {
                        noteTableTarget.append("TITLE");
                }
                
-               // TODO 他の項目もあとで追加
-               
                if (noteTableTarget.length() > 0) {
-                       query.prepare("CALL FTL_CREATE_INDEX('PUBLIC', 'NOTE', :column);");
-                       query.bindValue(":column", noteTableTarget.toString());
-                       if (!query.exec()) {
+                       nQuery.prepare("CALL FTL_CREATE_INDEX('PUBLIC', 'NOTE', :column);");
+                       nQuery.bindValue(":column", noteTableTarget.toString());
+                       if (!nQuery.exec()) {
+                               success = false;
+                       }
+               }
+               
+               return success;
+       }
+       
+       public static boolean rebuildFullTextResourceTarget(DatabaseConnection dbConn) {
+               NSqlQuery rQuery = new NSqlQuery(dbConn.getResourceConnection());
+               StringBuilder resourceTableTarget = new StringBuilder();
+               boolean success = true;
+               
+               if (Global.indexAttachmentsLocally()) {
+                       resourceTableTarget.append("RESOURCETEXT");
+               }
+               
+               if (resourceTableTarget.length() > 0) {
+                       rQuery.prepare("CALL FTL_CREATE_INDEX('PUBLIC', 'NOTERESOURCES', :column);");
+                       rQuery.bindValue(":column", resourceTableTarget.toString());
+                       if (!rQuery.exec()) {
                                success = false;
                        }
                }
index 1607030..48bc3f5 100644 (file)
@@ -455,7 +455,7 @@ public class NeverNote extends QMainWindow{
         indexRunner.indexImageRecognition = Global.indexImageRecognition();
 //        indexRunner.indexNoteBody = Global.indexNoteBody();
 //        indexRunner.indexNoteTitle = Global.indexNoteTitle();
-        indexRunner.specialIndexCharacters = Global.getSpecialIndexCharacters();
+//        indexRunner.specialIndexCharacters = Global.getSpecialIndexCharacters();
                indexThread.start();
                
         synchronizeAnimationTimer = new QTimer();
@@ -1463,7 +1463,7 @@ public class NeverNote extends QMainWindow{
         indexRunner.indexAttachmentsLocally = Global.indexAttachmentsLocally();
 //        indexRunner.indexNoteBody = Global.indexNoteBody();
 //        indexRunner.indexNoteTitle = Global.indexNoteTitle();
-        indexRunner.specialIndexCharacters = Global.getSpecialIndexCharacters();
+//        indexRunner.specialIndexCharacters = Global.getSpecialIndexCharacters();
         indexRunner.indexImageRecognition = Global.indexImageRecognition();
         if (Global.showTrayIcon() || Global.minimizeOnClose())
                trayIcon.show();
index 2613102..fc60069 100644 (file)
@@ -180,12 +180,12 @@ public class ConfigDialog extends QDialog {
                Global.setIndexNoteTitle(indexPage.getIndexNoteTitle());\r
                Global.setIndexImageRecognition(indexPage.getIndexImageRecognition());\r
 //             Global.setAutomaticWildcardSearches(indexPage.getAutomaticWildcardSearches());\r
-               Global.setSpecialIndexCharacters(indexPage.getSpecialCharacters());\r
+//             Global.setSpecialIndexCharacters(indexPage.getSpecialCharacters());\r
                Global.setIncludeTagChildren(appearancePage.getIncludeTagChildren());\r
                Global.setDisplayRightToLeft(appearancePage.getDisplayRightToLeft());\r
                \r
                Global.userStoreUrl = "https://"+debugPage.getServer()+"/edam/user";\r
-               Global.setWordRegex(indexPage.getRegex());\r
+//             Global.setWordRegex(indexPage.getRegex());\r
                Global.setRecognitionWeight(indexPage.getRecognitionWeight());\r
                Global.setIndexThreadSleepInterval(indexPage.getSleepInterval());\r
                Global.setMessageLevel( debugPage.getDebugLevel());\r
@@ -243,9 +243,14 @@ public class ConfigDialog extends QDialog {
                Global.setRensoListItemMaximum(rensoNoteListPage.getRensoListItemMaximum());\r
                \r
                // 全文検索の対象項目を再設定\r
-               NSqlQuery query = new NSqlQuery(conn.getConnection());\r
-               query.exec("CALL FTL_DROP_ALL();");     // カラム単位で削除できないので一度全部消して、再構築\r
-               Global.rebuildFullTextTarget(query);\r
+               NSqlQuery nQuery = new NSqlQuery(conn.getConnection());\r
+               NSqlQuery rQuery = new NSqlQuery(conn.getResourceConnection()); \r
+               // カラム単位で削除できないので一度全部消す\r
+               nQuery.exec("CALL FTL_DROP_ALL();");\r
+               rQuery.exec("CALL FTL_DROP_ALL();");\r
+               // 再構築\r
+               Global.rebuildFullTextNoteTarget(conn);\r
+               Global.rebuildFullTextResourceTarget(conn);\r
                \r
                close();\r
        }\r
@@ -356,7 +361,7 @@ public class ConfigDialog extends QDialog {
                appearancePage.setDisplayRightToLeft(Global.displayRightToLeft());\r
                appearancePage.setStartupNotebook(Global.getStartupNotebook());\r
                \r
-               indexPage.setRegex(Global.getWordRegex());\r
+//             indexPage.setRegex(Global.getWordRegex());\r
                indexPage.setSleepInterval(Global.getIndexThreadSleepInterval());\r
                connectionPage.setSyncInterval(Global.getSyncInterval());\r
                \r
index 3d1ec9b..2420a9f 100644 (file)
@@ -45,9 +45,9 @@ public class ConfigIndexPage extends QWidget {
        private final QCheckBox indexImageRecognition;\r
        private final QCheckBox indexTitle;\r
 //     private final QCheckBox automaticWildcard;\r
-       private final QLineEdit specialStrip;\r
+//     private final QLineEdit specialStrip;\r
        private final QCheckBox indexBody;\r
-       private final QLineEdit regexEdit;\r
+//     private final QLineEdit regexEdit;\r
        \r
        public ConfigIndexPage(QWidget parent) {\r
 //             super(parent);\r
@@ -79,8 +79,8 @@ public class ConfigIndexPage extends QWidget {
 //             automaticWildcard = new QCheckBox(tr("Automatically Wildcard All Searches"));\r
 //             automaticWildcard.setChecked(Global.automaticWildcardSearches());\r
                \r
-               specialStrip = new QLineEdit();\r
-               specialStrip.setText(Global.getSpecialIndexCharacters());\r
+//             specialStrip = new QLineEdit();\r
+//             specialStrip.setText(Global.getSpecialIndexCharacters());\r
                \r
                QVBoxLayout attachmentLayout = new QVBoxLayout();\r
                attachmentLayout.addWidget(indexBody);\r
@@ -89,10 +89,10 @@ public class ConfigIndexPage extends QWidget {
                attachmentLayout.addWidget(indexImageRecognition);\r
 //             attachmentLayout.addWidget(automaticWildcard);\r
                \r
-               QHBoxLayout specialCharLayout = new QHBoxLayout();\r
-               specialCharLayout.addWidget(new QLabel(tr("Special Word Characters")));\r
-               specialCharLayout.addWidget(specialStrip);\r
-               attachmentLayout.addLayout(specialCharLayout);\r
+//             QHBoxLayout specialCharLayout = new QHBoxLayout();\r
+//             specialCharLayout.addWidget(new QLabel(tr("Special Word Characters")));\r
+//             specialCharLayout.addWidget(specialStrip);\r
+//             attachmentLayout.addLayout(specialCharLayout);\r
                attachmentGroup.setLayout(attachmentLayout);\r
 \r
                // Index sleep interval\r
@@ -109,22 +109,22 @@ public class ConfigIndexPage extends QWidget {
                sleepGroup.setLayout(sleepLayout);\r
                \r
                // Regular Expressions for word parsing\r
-               QGroupBox regexGroup = new QGroupBox(tr("Word Parse"));\r
-               QLabel regexLabel = new QLabel(tr("Regular Expression"));\r
-               regexEdit = new QLineEdit();\r
-               regexEdit.setText(Global.getWordRegex());\r
-\r
-               QHBoxLayout regexLayout = new QHBoxLayout();\r
-               regexLayout.addWidget(regexLabel);\r
-               regexLayout.addWidget(regexEdit);               \r
-               regexGroup.setLayout(regexLayout);\r
+//             QGroupBox regexGroup = new QGroupBox(tr("Word Parse"));\r
+//             QLabel regexLabel = new QLabel(tr("Regular Expression"));\r
+//             regexEdit = new QLineEdit();\r
+//             regexEdit.setText(Global.getWordRegex());\r
+//\r
+//             QHBoxLayout regexLayout = new QHBoxLayout();\r
+//             regexLayout.addWidget(regexLabel);\r
+//             regexLayout.addWidget(regexEdit);               \r
+//             regexGroup.setLayout(regexLayout);\r
                \r
                \r
                QVBoxLayout mainLayout = new QVBoxLayout();\r
                mainLayout.addWidget(sleepGroup);\r
                mainLayout.addWidget(weightGroup);\r
                mainLayout.addWidget(attachmentGroup);\r
-               mainLayout.addWidget(regexGroup);\r
+//             mainLayout.addWidget(regexGroup);\r
                mainLayout.addStretch(1);\r
                setLayout(mainLayout);\r
 \r
@@ -144,9 +144,9 @@ public class ConfigIndexPage extends QWidget {
        public boolean getIndexNoteTitle() {\r
                return indexTitle.isChecked();\r
        }\r
-       public String getSpecialCharacters() {\r
-               return specialStrip.text();\r
-       }\r
+//     public String getSpecialCharacters() {\r
+//             return specialStrip.text();\r
+//     }\r
        public boolean getIndexImageRecognition() {\r
                return indexImageRecognition.isChecked();\r
        }\r
@@ -181,11 +181,11 @@ public class ConfigIndexPage extends QWidget {
        //*****************************************\r
        //* Regex get/set methods \r
        //*****************************************\r
-       public void setRegex(String s) {\r
-               regexEdit.setText(s);\r
-       }\r
-       public String getRegex() {\r
-               return regexEdit.text();\r
-       }\r
+//     public void setRegex(String s) {\r
+//             regexEdit.setText(s);\r
+//     }\r
+//     public String getRegex() {\r
+//             return regexEdit.text();\r
+//     }\r
 \r
 }\r
index 1ea7e23..5714bdf 100644 (file)
@@ -308,10 +308,25 @@ public class DatabaseConnection {
                                query2.exec();
                        }
                        
-                       // 全文検索のための準備
+                       // Apache Luceneを使った全文検索のための準備
                        query.exec("CREATE ALIAS IF NOT EXISTS FTL_INIT FOR \"org.h2.fulltext.FullTextLucene.init\"");
                        query.exec("CALL FTL_INIT()");
-                       Global.rebuildFullTextTarget(query);
+                       
+                       Global.rebuildFullTextNoteTarget(this);
+               }
+               
+               // Apache Luceneを使った日本語検索のためのプレーンテキストノートリソースカラムを準備
+               NSqlQuery rQuery = new NSqlQuery(resourceConn);
+               rQuery.exec("select TABLE_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='NOTERESOURCES' and COLUMN_NAME='RESOURCETEXT'");
+               if (!rQuery.next()) {
+                       rQuery.exec("alter table noteResources add column resourceText VarChar");
+                       rQuery.exec("update noteResources set resourceText = ''");
+                       
+                       // Apache Luceneを使った全文検索のための準備
+                       rQuery.exec("CREATE ALIAS IF NOT EXISTS FTL_INIT FOR \"org.h2.fulltext.FullTextLucene.init\"");
+                       rQuery.exec("CALL FTL_INIT()");
+                       
+                       Global.rebuildFullTextResourceTarget(this);
                }
        }
        
index 99746c6..d5507aa 100644 (file)
@@ -675,5 +675,27 @@ public class NoteResourceTable  {
                NSqlQuery query = new NSqlQuery(db.getResourceConnection());\r
                query.exec("update noteresources set isdirty=false");\r
        }\r
+       \r
+       // リソーステキストを更新\r
+       public void updateResourceText(String guid, String text) {\r
+               logger.log(logger.HIGH, "Entering NoteResourceTable.updateResourceText");\r
+               NSqlQuery query = new NSqlQuery(db.getResourceConnection());\r
+               boolean check = query.prepare("Update noteResources set resourceText=:resourceText where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update resourceText sql prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               \r
+               query.bindValue(":resourceText", text);\r
+               query.bindValue(":guid", guid);\r
+               \r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update resourceText has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               logger.log(logger.HIGH, "Leaving NoteResourceTable.updateResourceText");\r
+               query.exec();\r
+       }\r
 }\r
 \r
index 9dccbd6..46f2edf 100644 (file)
@@ -704,8 +704,10 @@ public class REnSearch {
                NSqlQuery indexQuery = new NSqlQuery(conn.getIndexConnection());\r
                NSqlQuery mergeQuery = new NSqlQuery(conn.getConnection());\r
                NSqlQuery deleteQuery = new NSqlQuery(conn.getConnection());\r
-               NSqlQuery ftlQuery = new NSqlQuery(conn.getConnection());\r
-               ftlQuery.prepare("SELECT N.GUID AS GUID FROM FTL_SEARCH_DATA(:text, 0, 0) FT, NOTE N WHERE FT.TABLE='NOTE' AND N.GUID=FT.KEYS[0]");\r
+               NSqlQuery ftlNoteQuery = new NSqlQuery(conn.getConnection());\r
+               NSqlQuery ftlResourceQuery = new NSqlQuery(conn.getResourceConnection());\r
+               ftlNoteQuery.prepare("SELECT N.GUID AS GUID FROM FTL_SEARCH_DATA(:text, 0, 0) FT, NOTE N WHERE FT.TABLE='NOTE' AND N.GUID=FT.KEYS[0]");\r
+               ftlResourceQuery.prepare("SELECT R.GUID AS GUID FROM FTL_SEARCH_DATA(:text, 0, 0) FT, NOTERESOURCES R WHERE FT.TABLE='NOTERESOURCES' AND R.GUID=FT.KEYS[0]");\r
                \r
                insertQuery.prepare("Insert into SEARCH_RESULTS (guid) values (:guid)");\r
                mergeQuery.prepare("Insert into SEARCH_RESULTS_MERGE (guid) values (:guid)");\r
@@ -735,11 +737,11 @@ public class REnSearch {
                                        }\r
                                }\r
                                \r
-                               // luceneによる全文検索\r
-                               ftlQuery.bindValue(":text", getWords().get(i));\r
-                               ftlQuery.exec();\r
-                               while(ftlQuery.next()) {\r
-                                       guid = ftlQuery.valueString(0);\r
+                               // luceneによる全文検索 ノートテーブル\r
+                               ftlNoteQuery.bindValue(":text", getWords().get(i));\r
+                               ftlNoteQuery.exec();\r
+                               while(ftlNoteQuery.next()) {\r
+                                       guid = ftlNoteQuery.valueString(0);\r
                                        if (i==0 || any) {\r
                                                insertQuery.bindValue(":guid", guid);\r
                                                insertQuery.exec();\r
@@ -748,6 +750,28 @@ public class REnSearch {
                                                mergeQuery.exec();\r
                                        }\r
                                }\r
+                               // luceneによる全文検索 リソーステーブル\r
+                               NSqlQuery rQuery = new NSqlQuery(conn.getResourceConnection());\r
+                               ftlResourceQuery.bindValue(":text", getWords().get(i));\r
+                               ftlResourceQuery.exec();\r
+                               while(ftlResourceQuery.next()) {\r
+                                       guid = ftlResourceQuery.valueString(0);\r
+                                       \r
+                                       // リソースguidからノートguidを算出\r
+                                       rQuery.prepare("Select noteGuid from noteResources where guid=:guid");\r
+                                       rQuery.bindValue(":guid", guid);\r
+                                       rQuery.exec();\r
+                                       while(rQuery.next()) {\r
+                                               guid = rQuery.valueString(0);\r
+                                               if (i==0 || any) {\r
+                                                       insertQuery.bindValue(":guid", guid);\r
+                                                       insertQuery.exec();\r
+                                               } else {\r
+                                                       mergeQuery.bindValue(":guid", guid);\r
+                                                       mergeQuery.exec();\r
+                                               }\r
+                                       }\r
+                               }\r
                                \r
                                if (i>0 && !any) {\r
                                        deleteQuery.exec("Delete from SEARCH_RESULTS where guid not in (select guid from SEARCH_RESULTS_MERGE)");\r
index abb7a86..ad26cd6 100644 (file)
@@ -72,8 +72,8 @@ public class IndexRunner extends QObject implements Runnable {
        public final int                                        REINDEXNOTE=3;
        public boolean                                          keepRunning;
        private final QDomDocument                      doc;
-       private static String                           regex = Global.getWordRegex();
-       public String                                           specialIndexCharacters = "";
+//     private static String                           regex = Global.getWordRegex();
+//     public String                                           specialIndexCharacters = "";
 //     public boolean                                          indexNoteBody = true;
 //     public boolean                                          indexNoteTitle = true;
        public boolean                                          indexImageRecognition = true;
@@ -366,10 +366,11 @@ public class IndexRunner extends QObject implements Runnable {
                        RTFParser parser = new RTFParser();     
                        ParseContext context = new ParseContext();
                        parser.parse(input, textHandler, metadata, context);
-                       String[] result = textHandler.toString().split(regex);
-                       for (int i=0; i<result.length && keepRunning; i++) {
-                               addToIndex(r.getNoteGuid(), result[i], "RESOURCE");
-                       }
+//                     String[] result = textHandler.toString().split(regex);
+//                     for (int i=0; i<result.length && keepRunning; i++) {
+//                             addToIndex(r.getNoteGuid(), result[i], "RESOURCE");
+//                     }
+                       updateResourceText(r.getGuid(), textHandler.toString());
                        input.close();
                
                        f.close();
@@ -413,13 +414,14 @@ public class IndexRunner extends QObject implements Runnable {
                        OpenDocumentParser parser = new OpenDocumentParser();   
                        ParseContext context = new ParseContext();
                        parser.parse(input, textHandler, metadata, context);
-                       String[] result = textHandler.toString().split(regex);
-                       for (int i=0; i<result.length && keepRunning; i++) {
-                               if (interrupt) {
-                                       processInterrupt();
-                               }
-                               addToIndex(r.getNoteGuid(), result[i], "RESOURCE");
-                       }
+//                     String[] result = textHandler.toString().split(regex);
+//                     for (int i=0; i<result.length && keepRunning; i++) {
+//                             if (interrupt) {
+//                                     processInterrupt();
+//                             }
+//                             addToIndex(r.getNoteGuid(), result[i], "RESOURCE");
+//                     }
+                       updateResourceText(r.getGuid(), textHandler.toString());
                        input.close();
                
                        f.close();
@@ -463,13 +465,14 @@ public class IndexRunner extends QObject implements Runnable {
                        OfficeParser parser = new OfficeParser();       
                        ParseContext context = new ParseContext();
                        parser.parse(input, textHandler, metadata, context);
-                       String[] result = textHandler.toString().split(regex);
-                       for (int i=0; i<result.length && keepRunning; i++) {
-                               if (interrupt) {
-                                       processInterrupt();
-                               }
-                               addToIndex(r.getNoteGuid(), result[i], "RESOURCE");
-                       }
+//                     String[] result = textHandler.toString().split(regex);
+//                     for (int i=0; i<result.length && keepRunning; i++) {
+//                             if (interrupt) {
+//                                     processInterrupt();
+//                             }
+//                             addToIndex(r.getNoteGuid(), result[i], "RESOURCE");
+//                     }
+                       updateResourceText(r.getGuid(), textHandler.toString());
                        input.close();
                
                        f.close();
@@ -514,13 +517,14 @@ public class IndexRunner extends QObject implements Runnable {
                        PDFParser parser = new PDFParser();     
                        ParseContext context = new ParseContext();
                        parser.parse(input, textHandler, metadata, context);
-                       String[] result = textHandler.toString().split(regex);
-                       for (int i=0; i<result.length && keepRunning; i++) {
-                               if (interrupt) {
-                                       processInterrupt();
-                               }
-                               addToIndex(r.getNoteGuid(), result[i], "RESOURCE");
-                       }
+//                     String[] result = textHandler.toString().split(regex);
+//                     for (int i=0; i<result.length && keepRunning; i++) {
+//                             if (interrupt) {
+//                                     processInterrupt();
+//                             }
+//                             addToIndex(r.getNoteGuid(), result[i], "RESOURCE");
+//                     }
+                       updateResourceText(r.getGuid(), textHandler.toString());
                        input.close();
                
                        f.close();
@@ -564,13 +568,14 @@ public class IndexRunner extends QObject implements Runnable {
                        OOXMLParser parser = new OOXMLParser(); 
                        ParseContext context = new ParseContext();
                        parser.parse(input, textHandler, metadata, context);
-                       String[] result = textHandler.toString().split(regex);
-                       for (int i=0; i<result.length && keepRunning; i++) {
-                               if (interrupt) {
-                                       processInterrupt();
-                               }
-                               addToIndex(r.getNoteGuid(), result[i], "RESOURCE");
-                       }
+//                     String[] result = textHandler.toString().split(regex);
+//                     for (int i=0; i<result.length && keepRunning; i++) {
+//                             if (interrupt) {
+//                                     processInterrupt();
+//                             }
+//                             addToIndex(r.getNoteGuid(), result[i], "RESOURCE");
+//                     }
+                       updateResourceText(r.getGuid(), textHandler.toString());
                        input.close();
                
                        f.close();
@@ -623,38 +628,43 @@ public class IndexRunner extends QObject implements Runnable {
        }
 
        
-       private void addToIndex(String guid, String word, String type) {
-               if (foundWords.contains(word))
-                       return;
-               StringBuffer buffer = new StringBuffer(word.toLowerCase());
-               for (int i=buffer.length()-1; i>=0; i--) {
-                       if (!Character.isLetterOrDigit(buffer.charAt(i)) && specialIndexCharacters.indexOf(buffer.charAt(i)) == -1)
-                               buffer.deleteCharAt(i);
-                       else
-                               break;
-               }
-               buffer = buffer.reverse();
-               for (int i=buffer.length()-1; i>=0; i--) {
-                       if (!Character.isLetterOrDigit(buffer.charAt(i)))
-                               buffer.deleteCharAt(i);
-                       else
-                               break;
-               }
-               buffer = buffer.reverse();
-               if (buffer.length() > 0) {
-                       // We have a good word, now let's trim off junk at the beginning or end
-                       if (!foundWords.contains(buffer.toString())) {
-                               foundWords.add(buffer.toString());
-                               foundWords.add(word);
-                               conn.getWordsTable().addWordToNoteIndex(guid, buffer.toString(), type, 100);
-                               uncommittedCount++;
-                               if (uncommittedCount > 100) {
-                                       conn.commitTransaction();
-                                       uncommittedCount=0;
-                               }
-                       }
-               }
-               return;
+//     private void addToIndex(String guid, String word, String type) {
+//             if (foundWords.contains(word))
+//                     return;
+//             StringBuffer buffer = new StringBuffer(word.toLowerCase());
+//             for (int i=buffer.length()-1; i>=0; i--) {
+//                     if (!Character.isLetterOrDigit(buffer.charAt(i)) && specialIndexCharacters.indexOf(buffer.charAt(i)) == -1)
+//                             buffer.deleteCharAt(i);
+//                     else
+//                             break;
+//             }
+//             buffer = buffer.reverse();
+//             for (int i=buffer.length()-1; i>=0; i--) {
+//                     if (!Character.isLetterOrDigit(buffer.charAt(i)))
+//                             buffer.deleteCharAt(i);
+//                     else
+//                             break;
+//             }
+//             buffer = buffer.reverse();
+//             if (buffer.length() > 0) {
+//                     // We have a good word, now let's trim off junk at the beginning or end
+//                     if (!foundWords.contains(buffer.toString())) {
+//                             foundWords.add(buffer.toString());
+//                             foundWords.add(word);
+//                             conn.getWordsTable().addWordToNoteIndex(guid, buffer.toString(), type, 100);
+//                             uncommittedCount++;
+//                             if (uncommittedCount > 100) {
+//                                     conn.commitTransaction();
+//                                     uncommittedCount=0;
+//                             }
+//                     }
+//             }
+//             return;
+//     }
+       
+       // ノートリソーステーブルのリソーステキストに追加
+       private void updateResourceText(String guid, String text) {
+               conn.getNoteTable().noteResourceTable.updateResourceText(guid, text);
        }
        
        private void scanUnindexed() {