Postgresql

如何使用 java 從 Postgresql 索引中檢索數據

  • June 14, 2013

我正在編寫一個搜尋應用程序,使用 Postgresql 的文本搜尋。我是數據庫的初學者。我創建了一個 Gin 索引,並試圖從中獲取數據。我的程式碼是

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class JDBCPostgressRetrieve {

   private static String Database = "jdbc:postgresql://localhost/search";
   private static String user = "postgres";
   private static String password = "abcd";

   public static String getDatabase() {
       return Database;
   }

   public static String getUser() {
       return user;
   }

   public static String getPassword() {
       return password;
   }

   public void retrieve(int limit) {

       Statement stmt = null;
       Connection connection = null;
       ResultSet rs = null; 
       int i = 0;
       try {

           Class.forName("org.postgresql.Driver");

       } catch (ClassNotFoundException e) {

           System.out.println("Where is your PostgreSQL JDBC Driver? "
                   + "Include in your library path!");
           e.printStackTrace();
       }

       try {

           connection = DriverManager.getConnection(
                   JDBCPostgressRetrieve.getDatabase(),
                   JDBCPostgressRetrieve.getUser(),
                   JDBCPostgressRetrieve.getPassword());

           if (connection == null) {
               System.out.println("Failed to make connection!");
           } else {

               DateFormat dateFormat = new SimpleDateFormat(
                       "yyyy/MM/dd HH:mm:ss");
               Date date = new Date();

               // Creating Statement for query execution
               stmt = connection.createStatement();
               // creating Query String                
               String query = "SELECT (person_name,email,mobile_number,key_skills,current_employer)\n" +
                               "FROM bhubneshwar\n" +
                               "WHERE textsearchable_index_col @@ to_tsquery('MBA & HR')\n" +
                               "LIMIT 10";

               // excecuting query
               rs = stmt.executeQuery(query);
               while (rs.next()) {
                   // Didplaying data of tables
                   System.out.println("Name : " + rs.getString("person_name"));
                   System.out.println("email : " + rs.getString("email"));
                   System.out.println("mobile_number : " + rs.getString("mobile_number"));
                   System.out.println("key_skills : " + rs.getString("key_skills"));
                   System.out.println("current_employer : " + rs.getString("current_employer"));
               }
           }

       } catch (SQLException e) {

           System.out.println("Connection Failed! Check output console");
           e.printStackTrace();
       }
       finally {
           try {
               rs.close();
               stmt.close();
               connection.close();
           }catch(SQLException e) {
               System.err.println("SQLException while closing connection. "+ e.getMessage());
           }           
       }
   }

   public static void main(String args []) {
       JDBCPostgressRetrieve ret = new JDBCPostgressRetrieve();
       ret.retrieve(100);
   }
}

textsearchable_index_col 是表中的索引列。但是在執行程式碼後,我得到了一個錯誤。

org.postgresql.util.PSQLException: The column name person_name was not found in this ResultSet.
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.findColumn(AbstractJdbc2ResultSet.java:2727)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getString(AbstractJdbc2ResultSet.java:2567)
at com.presciencesoft.postgres.search.JDBCPostgressRetrieve.retrieve(JDBCPostgressRetrieve.java:77)
at com.presciencesoft.postgres.search.JDBCPostgressRetrieve.main(JDBCPostgressRetrieve.java:103)

這樣我可以從索引中檢索表嗎?此查詢在命令提示符下完美執行。

括號形成一個行建構子,因此您的查詢返回一個單列行文字,本質上是一種匿名複合類型。

比較:

regress=> SELECT (1,2);
 row  
-------
(1,2)
(1 row)

regress=> SELECT 1, 2;
?column? | ?column? 
----------+----------
       1 |        2
(1 row)

psql如果您在命令行上執行查詢(或者如果您更喜歡 GUI,則在 PgAdmin-III 中)執行查詢,您會很快意識到這一點。

第二個誤解:您不會從索引1中檢索數據。您從表中獲取數據。數據庫引擎可能會使用現有的任何索引來加快查詢速度,但您仍會從表中獲取數據。如果您explain使用命令獲取其查詢計劃,則可以看到這一點。

1 : … 好吧,可以說直到 PostgreSQL 9.2 的索引掃描,但這是一個實現細節。

引用自:https://dba.stackexchange.com/questions/44534