【问题标题】:Populating the Lucene 3.6 File Directory Index填充 Lucene 3.6 文件目录索引
【发布时间】:2013-05-10 12:51:56
【问题描述】:

我正在将一个 lucene 3.6 搜索 API 集成到一个 java 桌面应用程序中。 lucene 系统使用文件系统目录来存储索引。 创建索引目录、索引编写器并将文档添加到索引的代码。

索引的数据是从 derby 数据库收集的。数据库表的字段 作为字段添加到 lucene 文档中。因此,数据库表中的每一行都表示为单个 lucene 文档。

我的问题是,有没有办法检查索引目录,如果 它没有填充 lucene 文档然后填充它。或跳过 当索引已经填充时重新填充。

创建索引文件的代码。

public File createIndexDir() throws IOException, SQLException
    {       
    //Check if directory exist 
      if(!userDir.exists())
      { userDir.mkdir();
      System.out.println(" Index directory created at  " + userDir.getAbsolutePath());     
      }  
      return userDir.getAbsoluteFile();
    }

创建索引编写器的代码

public void createIndexWriter() throws IOException, SQLException
    {
     indexDir =  createIndexDir();  
     if(iw == null)
          {
            try {
                // create some index
              StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
             IndexWriterConfig IWConfig = new IndexWriterConfig(Version.LUCENE_36, analyzer);

             iw = new IndexWriter(FSDirectory.open(indexDir), IWConfig);

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

这是用数据库中的数据填充索引文件的代码

     public void buildIndex () throws SQLException, CorruptIndexException, IOException
     {   

     /* Connecting to the database */
    Connection  con = DriverManager.getConnection(host, uName, uPass);
    Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
    String sql = "SELECT * FROM APP.REGISTRY";
    ResultSet rs = stmt.executeQuery(sql); 


    rs.beforeFirst();  //set poinyrt to begining of result set
     while(rs.next())
     {
     Document doc = new Document();

     doc.add(new Field("id",rs.getString("ID"),Field.Store.YES,Field.Index.NO));

     if(rs.getString("SUBJECT")== null)
     { doc.add(new Field("subject","",Field.Store.YES,Field.Index.ANALYZED)); }
     else {
     doc.add(new Field("subject",rs.getString("SUBJECT"),Field.Store.YES,Field.Index.ANALYZED));
     }

     if(rs.getString("LETTER_FROM")== null)
     { doc.add(new Field("letter_from"," ",Field.Store.YES,Field.Index.ANALYZED)); }
     else {
     doc.add(new Field("letter_from",rs.getString("LETTER_FROM"),Field.Store.YES,Field.Index.ANALYZED));
     }

    doc.add(new Field("date_of_letter",DateTools.dateToString(rs.getDate("DATE_OF_LETTER"),
            DateTools.Resolution.DAY),Field.Store.YES,Field.Index.ANALYZED)); 

      doc.add(new Field("date_received",DateTools.dateToString(rs.getDate("DATE_RECEIVED"),
            DateTools.Resolution.DAY),Field.Store.YES,Field.Index.NO));             

     if(rs.getString("REMARKS")== null)
     { doc.add(new Field("remarks"," ",Field.Store.YES,Field.Index.ANALYZED)); }
     else {
     doc.add(new Field("remarks",rs.getString("REMARKS"),Field.Store.YES,Field.Index.ANALYZED));  }

      if(rs.getDate("DATE_DISPATCHED")== null)
     { doc.add(new Field("date_dispatched",DateTools.dateToString(new Date(0L),DateTools.Resolution.DAY),Field.Store.YES,Field.Index.ANALYZED)); }
     else {
    doc.add(new Field("date_dispatched",DateTools.dateToString(rs.getDate("DATE_DISPATCHED"),
            DateTools.Resolution.MINUTE),Field.Store.YES,Field.Index.ANALYZED));    
            }     

     if(rs.getString("OFFICE_DISPATCHED_TO")== null)
     { doc.add(new Field("office_dispatched_to"," ",Field.Store.YES,Field.Index.ANALYZED));}
     else {
     doc.add(new Field("office_dispatched_to",rs.getString("OFFICE_DISPATCHED_TO"),Field.Store.YES,Field.Index.ANALYZED)); 
       }
     iw.addDocument(doc);
     }   
   iw.commit();     
   closeIndexWriter();
   stmt.close();
   rs.close();
   con.close();
     }

任何解决方案的想法。 为大家喝彩。

【问题讨论】:

  • 请定义人口.. 你想如何处理半人口的情况?
  • 抱歉,填充是指创建字段和文档并将它们添加到 lucene 索引中。

标签: java lucene


【解决方案1】:

您可以在索引中查询您知道 Derby DB 中的数据,可以是一些示例条目,也可以是总记录数。如果存在,则无需重新填充索引。

【讨论】:

    【解决方案2】:

    您可以尝试以下任何/所有步骤。

    1) 检查您计划填充的索引中是否存在第一个和最后一个条目。

    2)如果可能的话,您还可以比较您的数据源和Lucene Index(文件更新日期)的最新更新时间。

    3) 您可以检查应该在索引中的条目数。 IndexReader.numDocs() 或 maxDocs() 等等。这与您的用例相关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      相关资源
      最近更新 更多