Postgresql
如何使用 java 從 Postgresql 索引中檢索數據
我正在編寫一個搜尋應用程序,使用 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 的索引掃描,但這是一個實現細節。