简体   繁体   English

在Java jTable中显示Lucene搜索结果

[英]Displaying lucene search results in java jTable

I am building a java desktop application that uses lucene 3.6.2 search engine to search for data in a derby database java swing JTable and netbeans A user enters a search query into the testfield and the search result is displayed in a Jtable and the defaulttablemodel. 我正在构建一个使用lucene 3.6.2搜索引擎在derby数据库中搜索数据的Java桌面应用程序Java swing JTable和netbeans用户在testfield中输入搜索查询,并且搜索结果显示在Jtable和defaulttablemodel中。

I have tried my hands on tutorials about displaying database information in a jTable. 我已经尝试过有关在jTable中显示数据库信息的教程。

But this time I want to have a search field and a search button. 但是这次我要有一个搜索字段和一个搜索按钮。 a string is entered into the search field after finding the matches , then the result is displayed in the JTable 找到匹配项后,在搜索字段中输入一个字符串,然后结果将显示在JTable中

below are code snippets 以下是代码片段

public class GNSSJFrame extends javax.swing.JFrame {
     String searchField;
     DBSearch dbs = new DBSearch();
     Vector<String> header = new Vector<>();;
     Vector<Vector<String>> tabledata = new Vector<>();;
     TableData td = new TableData();

  public GNSSJFrame() {         

        initComponents();
    }


        searchResultTable.setModel(new javax.swing.table.DefaultTableModel(
            tabledata, header
        ));
        searchResultTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        jScrollPane1.setViewportView(searchResultTable);

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jLabel2.setText("        SEARCH RESULTS");


        private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
        try {

            searchField = searchTextField.getText();
            if(!searchField.isEmpty())
            {                
           tabledata = dbs.searchDatabase(searchField + "*");
             td.fillHeader();
            header = td.getHeader();
            }

        } catch (CorruptIndexException ex) {
            Logger.getLogger(GNSSJFrame.class.getName()).log(Level.SEVERE, null, ex);
        } catch (LockObtainFailedException ex) {
            Logger.getLogger(GNSSJFrame.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException | ParseException ex) {
            Logger.getLogger(GNSSJFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }                                            

    private void searchTextFieldActionPerformed(java.awt.event.ActionEvent evt) {                                                
        // TODO add your handling code here:
    }                                               

 Code for the lucene search engine

public class DBSearch {

    //Field Declarations 
    Version matchVersion = Version.LUCENE_36;
    String host  = "jdbc:derby://localhost:1527/NSS_DB";
     String uName = "staff";
     String uPass = "password";
     String qString;
     Statement stmt;
     ResultSet rs;
     Connection con;
     Document doc;
     Vector<Vector<String>> docVector;
      Document d;

    public DBSearch()
    {}

    public Vector<Vector<String>> searchDatabase( String qs) throws CorruptIndexException, LockObtainFailedException, IOException, ParseException
    {
        qString = qs;

        // create some index
        Directory index = new RAMDirectory();
        StandardAnalyzer analyzer = new StandardAnalyzer(matchVersion);
        IndexWriterConfig IWConfig = new IndexWriterConfig(Version.LUCENE_36, analyzer);
        IndexWriter iw = new IndexWriter(index,IWConfig) ;

           try {

      con = DriverManager.getConnection(host, uName, uPass);

    Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
     String sql = "SELECT * FROM APP.REGISTRY";
        rs = stmt.executeQuery(sql);

         rs.beforeFirst();
         while(rs.next()) {
         doc = new Document();
         doc.add(new Field("subject",rs.getString("SUBJECT"),Field.Store.YES,Field.Index.ANALYZED));
         doc.add(new Field("letter_from",rs.getString("LETTER_FROM"),Field.Store.YES,Field.Index.ANALYZED));
       iw.addDocument(doc);
         }

       iw.close();
       stmt.close();
       rs.close();
    }                           
         catch(SQLException err)
         {System.out.println(err.getMessage());}

     //Oen the index 
           IndexReader ir = IndexReader.open(index);

           //create the searcher object
            IndexSearcher searcher = new IndexSearcher(ir);
            QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_36,
                    new String[]{"subject","letter_from","remarks","office_dispatched_to"}, analyzer);
            Query query = queryParser.parse(qString);

            //Displaying the search results 
            TopDocs topDocs = searcher.search(query,10);
            ScoreDoc[] hits = topDocs.scoreDocs;
             System.out.println("Total hits "+topDocs.totalHits);


        for(int q = 0; q<7 ;q++)
        {
        Vector<String>  vn = new Vector<>();
        vn.add(d.get("subject"));
        vn.add("letter_from");
        vn.add("remark");
        vn.add("office_dispatched_to"); 
        }
            return docVector;  
}


public class TableData {

    private Vector<Vector<String>> matrix = new Vector<>();
    private Vector<String> header = header = new Vector<>();;

    public TableData()
    {   }

    public Vector<Vector<String>> getMatrix() {
        return matrix;
    }

    public void setMatrix(Vector<Vector<String>> matrix) {
        this.matrix = matrix;
    }

    public Vector<String> getHeader() {
        return header;
    }

    public void setHeader(Vector<String> header) {
        this.header = header;
    }

    public void fillHeader(){
        header.add(0,"ID");
        header.add(1,"SUBJECT");
        header.add(2,"LETTER DATE");
        header.add(3,"DATE RECEIED");
        header.add(4,"REMARKS");
        header.add(5,"DATE DISPATCHED");
        header.add(6,"DESTINATION OFFICE");
    }   
}

    } 

It looks like you are constructing an anonymous DefaultTableModel using a suitable Vector , but you subsequently update the Vector rather than the TableModel itself. 看起来您正在使用适当的Vector来构造匿名DefaultTableModel ,但是随后您将更新Vector而不是TableModel本身。 Updating the model should cause the table to refresh itself. 更新模型应导致表刷新。 You can obtain a reference to your model from table.getModel() , and you can update it using model.setDataVector() . 您可以从table.getModel()获得对模型的引用,并可以使用model.setDataVector()对其进行更新。 Extending AbstractTableModel , as shown here , may be an alternative. 延伸AbstractTableModel ,如图所示在这里 ,可以是另一种选择。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM