lucene errror:索引到目录'c:/ index'...添加1234 java.lang.IllegalArgumentException:value不能为null 1002 total milliseconds

时间:2016-03-23 12:40:21

标签: java apache lucene luke

package lucene;

import java.io.File;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.DateTools.Resolution;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Lucenetest {
//database connection
public static final String PATH = "C:/dbindex/index.txt";
private static final String JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String CONNECTION_URL = "jdbc:sqlserver://WMDENTW1\\SQLEXPRESS:1433;" + 
                    "database=FullTextDB;" + 
                    "user=root;" + 
                    "password=root123";
private static final String QUERY = "select FTID, ID, CLASSID, TEXT, PUBNOTICECONTENT, DOCUMENTCONTENT, contentSum_DE from METADATA_FULLTEXT";
public static void main(String[] args) throws Exception {
Lucenetest indexer = new Lucenetest();

//error here

***Directory indexDir = FSDirectory.open(new File(PATH).toPath());***

try {   
// Index Writer 
   Class . forName ( JDBC_DRIVER ). newInstance ();  

   Connection conn = DriverManager.getConnection(CONNECTION_URL); 

   StandardAnalyzer analyzer = new StandardAnalyzer();  

   IndexWriterConfig  config  =  new  IndexWriterConfig ( analyzer );

   IndexWriter index writer =  new  IndexWriter ( indexDir ,  config );  

   System.out.println("Indexing to directory '" + indexDir + "'...");  

   int indexedDocumentCount = indexer.indexDocs1(indexWriter, conn);  

   index writer . close ();  

   System.out.println(indexedDocumentCount + " records have been indexed successfully");

} catch (Exception e) {  
   e.printStackTrace();  
} 
}

@SuppressWarnings("deprecation")
int indexDocs1(IndexWriter writer, Connection conn) throws Exception {  
  String sql = QUERY;  
  Statement stmt = conn.createStatement();  
  ResultSet rs = stmt.executeQuery(sql);  
  int i=0;
  while (rs.next()) {  
     Document d = new Document();  
 d.add(new StringField("FTID", rs.getString("FTID"), StringField.Store.YES));
 d.add(new StringField("ID", rs.getString("ID"), StringField.Store.YES));
 d.add(new StringField("CLASSID", rs.getString("CLASSID"), StringField.Store.YES));
 d.add(new StringField("TEXT", rs.getString("TEXT"), StringField.Store.YES));
 d.add(new StringField("PUBNOTICECONTENT", rs.getString("PUBNOTICECONTENT"), StringField.Store.YES));
 d.add(new StringField("DOCUMENTCONTENT", rs.getString("DOCUMENTCONTENT"), StringField.Store.YES));
 d.add(new StringField("contentSum_DE", rs.getString("contentSum_DE"), StringField.Store.YES));

     writer.addDocument(d);  
     i++;
 }  
  return i;
}


    private static void indexDocs(IndexWriter writer, Connection conn) {
        // TODO Auto-generated method stub

    }
}

我得到一个例外,索引到目录:

  

MMapDirectory @ C:\ dbindex lockFactory=org.apache.lucene.store.NativeFSLockFactory@4493d195'...
  java.lang.IllegalArgumentException:在
时,value不能为null   org.apache.lucene.document.Field。(Field.java:238)在   org.apache.lucene.document.StringField。(StringField.java:61)在   lucene.Lucenetest.indexDocs1(Lucenetest.java:80)在   lucene.Lucenetest.main(Lucenetest.java:56)

不确定我错过了什么。

1 个答案:

答案 0 :(得分:0)

您在代码中标记此异常的位置没有意义。您的IndexDocs1方法中会抛出该异常。

如果值(或字段名称)为null,

StringFieldTextField将抛出IllegalArgumentException。从数据库中的可空字段导入时,应检查空值并跳过该字段,或将其替换为默认值(如果您希望能够查询空值,则使用默认值非常有用)。 / p>

另外:您的Directory应该是一个目录。这一行:

Directory indexDir = FSDirectory.open(new File("C:/dbindex/index.txt").toPath());

将创建一个名为" index.txt"的新目录,而不是文件。如果此类文件已存在,则该行抛出FileAlreadyExistsException