Java - Как интегрировать извлеченные слова из PDF-файлов в MYSQL для индексации? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть простое приложение на Java, написанное для поиска файла PDF, извлечения всего текста внутри него и сохранения его в HashSet .

У меня также есть база данных, созданная в MySQL с таблицей, состоящей из columns ID, Location PATH, and Word.Путь к местоположению должен хранить путь PDF, из которого он читает и извлекает слова.Например, "D:/PDF/my.pdf ".

Word должен хранить все слова, извлеченные из этого конкретного файла PDF, в hashSet.

Проблема в том, как интегрировать, сохраняя hashSetк моей таблице базы данных, чтобы она сохраняла расположение пути и слов соответственно при запуске?

Это код:

public class Main {

    public static void main(String[] args) throws Exception {

        HashSet<String> uniqueWords = new HashSet<>();
        try (PDDocument document = PDDocument.load(new File("D:/PDF/my.pdf"))) {

            if (!document.isEncrypted()) {

                PDFTextStripper tStripper = new PDFTextStripper();
                String pdfFileInText = tStripper.getText(document);
                String lines[] = pdfFileInText.split("\\r?\\n");
                for (String line : lines) {
                    String[] words = line.split(" ");

                    for (String word : words) {
                        uniqueWords.add(word);

                    }

                }
               System.out.println(uniqueWords);

            }
        } catch (IOException e){
            System.err.println("Exception while trying to read pdf document - " + e);
        }

        MysqlAccess connection=new MysqlAccess();
        connection.readDataBase();

    }

}

Код SQL-соединения:

public class MysqlAccess {
    private Connection connect = null;
    private Statement statement = null;
    private PreparedStatement preparedStatement = null;
    private ResultSet resultSet = null;

    public void readDataBase() throws Exception {
        try {
            // This will load the MySQL driver, each DB has its own driver
            Class.forName("com.mysql.jdbc.Driver");
            // Setup the connection with the DB
            connect = DriverManager
                    .getConnection("jdbc:mysql://126.32.3.20/fulltext_ltat?"
                            + "user=root&password=root");

            // Statements allow to issue SQL queries to the database
            statement = connect.createStatement();
            System.out.print("Connected");
            // Result set get the result of the SQL query

            preparedStatement = connect
                    .prepareStatement("insert into  fulltext_ltat.index_detail values (default, ?, ?)");

            preparedStatement.setString(1, "D:\\Full Text Indexing\\testIndex");
            preparedStatement.setString(2, "test");
            preparedStatement.executeUpdate();
            resultSet = statement
                    .executeQuery("select * from fulltext_ltat.index_detail");



            writeResultSet(resultSet);
        } catch (Exception e) {
            throw e;
        } finally {
            close();
        }

    }



    private void writeResultSet(ResultSet resultSet) throws SQLException {
        // ResultSet is initially before the first data set
        while (resultSet.next()) {
            // It is possible to get the columns via name
            // also possible to get the columns via the column number
            // which starts at 1
            // e.g. resultSet.getSTring(2);
            String path = resultSet.getString("path");
            String word = resultSet.getString("word");



            System.out.println();
            System.out.println("path: " + path);
            System.out.println("word: " + word);

        }
    }


    private void close() {
        try {
            if (resultSet != null) {
                resultSet.close();
            }

            if (statement != null) {
                statement.close();
            }

            if (connect != null) {
                connect.close();
            }
        } catch (Exception e) {

        }
    }

}

Любое предложение будет оценено.

РЕДАКТИРОВАТЬ: Для тех, кто не понимает, что я имею в виду,

Допустим, у меня есть файл PDF с именем "my.pdf". Когда я извлекаю слова, которыеэтот файл и хранит уникальное слово в хэш-наборе, я хотел бы, чтобы оно также сохранялось в таблице, которую я создал в mySQL. Скажем, что pdf находится в "D:/Folder/my.pdf", тогда таблица должна выглядеть так:

ID Location                Word 
1 "D:/FOLDER/my.pdf"       family 
2 "D:/FOLDER/my.pdf"       chicken....... and it goes on and on

Это вообще выполнимо?

1 Ответ

0 голосов
/ 09 октября 2018

Вот несколько советов, которые могут вам помочь:

package com.test;

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;

public class PopulateDatabase {

    // Read all the words in the file
    private static Set<String> getWordsFromFile(File pdfFile) throws IOException  {
        Set<String> uniqueWords = new HashSet<String>();
        // PDDocument document = PDDocument.load(pdfFile);
        // ...
        //   for (String word : words) {
        //      uniqueWords.add(word);
        //      ...
        return uniqueWords;
    }

    private static void updateDB(File pdfFile, Set<String>uniqueWords) throws ClassNotFoundException, SQLException {
        // Open DB
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://126.32.3.20/fulltext_ltat?user=root&password=root");

        // Insert rows
        for (String word : uniqueWords) {
            PreparedStatement preparedStatement = 
                conn.prepareStatement("insert into  fulltext_ltat.index_detail values (default, ?, ?)");
            preparedStatement.setString(1, pdfFile.getAbsolutePath());
            preparedStatement.setString(2, word);
            preparedStatement.executeUpdate();
        }

        // Close DB
        conn.close();
    }

    public static void main(String[] args) {
        // Read filepath for .pdf from cmd-line
        if (args.length == 0) {
            System.out.println("USAGE: PopulateDatabase <myPdfFiles>");
            return;
        }

        // Convert to Java "File" object.
        File pdfFile = new File(args[0]);
        if (!pdfFile.exists() ) {
            System.out.println("ERROR: " + args[0] + " does not exist!");
            return;
        }

        try {   
            // Parse file
            Set<String> words = getWordsFromFile(pdfFile);

            // Update database
            updateDB(pdfFile, words);

            // Done
            System.out.println("Done: #/words: " + words.size() + ", pdfFile: " + pdfFile.getName());
        } catch (Exception e) {
            // ...
        }
    }

}

Вы можете немного изменить код, чтобы разрешить использование нескольких файлов или подстановочных знаков.Вы также можете добавить другой метод для запроса добавленных строк.

Чтобы сэкономить место в вашей базе данных, вы можете присвоить каждому пути к файлу идентификатор (а не хранить всю строку пути к файлу для каждого слова).

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...