小弟才了解lucene不多久。
我从一个文本文件中查找一个字符串然后需要获得这个字符串对应的那条内容。
我用lucene中的Highlighter,运行后报了个空指针异常
找到: 1  个结果!
File: E:\s\b.txt
content=null
Exception in thread "main" java.lang.NullPointerException
at java.io.StringReader.<init>(Unknown Source)
at newFile.TestQuery.main(TestQuery.java:56)下面是我的代码,
lucene 2.0 
package newFile;import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.util.Date;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;public class TxtFileIndexer {
public static void main(String[] args) throws Exception{ File   indexDir = new File("E:\\index");
        File   dataDir  = new File("E:\\s"); 
//        Analyzer luceneAnalyzer = new StandardAnalyzer();
        Analyzer luceneAnalyzer = new WhitespaceAnalyzer();
        File[] dataFiles  = dataDir.listFiles();
        IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);
        indexWriter.setMaxFieldLength(99999999);//增加内存域长度限制(非常重要)
        long startTime = new Date().getTime();
        for(int i = 0; i < dataFiles.length; i++){
         if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){
         System.out.println("索引文件: " + dataFiles[i].getCanonicalPath());
         Document document = new Document();
         Reader txtReader = new FileReader(dataFiles[i]);
         document.add(new Field("path",dataFiles[i].getCanonicalPath(),Field.Store.YES,
                        Field.Index.NO));
         document.add(new Field("content",txtReader));
         indexWriter.addDocument(document);
         }
        }
        indexWriter.optimize();
        indexWriter.close();
        long endTime = new Date().getTime();
        
        System.out.println("花了 " + (endTime - startTime) 
                           + " 毫秒创建索引! "
                    + dataDir.getPath());        
}
}
package newFile;import java.io.IOException;
import java.io.StringReader;
import java.util.Date;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;public class TestQuery {
public static void main(String[] args) throws IOException, ParseException {
Date startDate = new Date();
Hits hits = null;
String queryString = "张1999";
Query query = null;
IndexSearcher searcher = new IndexSearcher("e:/index");
Highlighter highlighter = null; //高亮显示
// Analyzer analyzer = new StandardAnalyzer();
Analyzer analyzer = new WhitespaceAnalyzer();
try {
QueryParser qp = new QueryParser("content", analyzer);
query = qp.parse(queryString);

//高亮显示设置
    SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<read>","</read>");   
    highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query));      
    //这个100是指定关键字字符串的context的长度,你可以自己设定,因为不可能返回整篇正文内容
    highlighter.setTextFragmenter(new SimpleFragmenter(100));

} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("-------");
if (searcher != null) {
System.out.println("sercher != null");
hits = searcher.search(query);
System.out.println(hits.length());
for (int i = 0; i < hits.length(); i++) {
System.out.println(" 找到: " + hits.length() + "  个结果! ");
Document doc = hits.doc(i);
System.out.println("File: " + doc.get("path"));
System.out.println("content="+doc.get("content")); //高亮出显示
         TokenStream tokenStream =analyzer.tokenStream("content", new StringReader(doc.get("content")));
            System.out.println(highlighter.getBestFragment(tokenStream,hits.doc(i).get("content")));
}
} else {
System.out.println("空");
}
Date endDate = new Date();
System.out.println("花费" + (endDate.getTime()-startDate.getTime()) +"毫秒");
}}
哪位帮忙看下

解决方案 »

  1.   

    为什么能够搜索到 而 System.out.println("content="+doc.get("content")); 这样却是NULL呢?
     
      

  2.   

    能够显示了现在的问题是 我检索的时候为什么只能检索文本文件中前面的几百条内容,如果要查找的字符串在后面的话就查找不到了。。
    创建索引的时候也好像是这样子 但是 设置这个属性 indexWriter.setMaxFieldLength(99999999); 就可以了。有谁知道查找的时候设置的是什么属性呢????