Apache Can';t在Lucene搜索中再次搜索同一个单词

Apache Can';t在Lucene搜索中再次搜索同一个单词,apache,lucene,Apache,Lucene,我是Lucene的新手,所以我从下载了一个示例。 代码目前可以工作,但是,我认为我没有正确地使用Lucene。我可以第一次搜索一个单词(例如:is student),但是在那之后(仍然在循环中),如果我搜索同一个单词,它将返回一个异常。(java.lang.NullPointerException) 请帮我修一下 这是密码 import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.

我是Lucene的新手,所以我从下载了一个示例。 代码目前可以工作,但是,我认为我没有正确地使用Lucene。我可以第一次搜索一个单词(例如:is student),但是在那之后(仍然在循环中),如果我搜索同一个单词,它将返回一个异常。(java.lang.NullPointerException) 请帮我修一下

这是密码

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import java.io.*;
import java.util.ArrayList;
public class TextFileIndexer {
private static StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);

private IndexWriter writer;
private ArrayList<File> queue = new ArrayList<File>();


public static void main(String[] args) throws IOException {
System.out.println("Enter the path where the index will be created: (e.g. /tmp/index or c:\temp\index)");

String indexLocation = null;
BufferedReader br = new BufferedReader(
        new InputStreamReader(System.in));
String s = br.readLine();

TextFileIndexer indexer = null;
try {
  indexLocation = s;
  indexer = new TextFileIndexer(s);
} catch (Exception ex) {
  System.out.println("Cannot create index..." + ex.getMessage());
  System.exit(-1);
}

while (!s.equalsIgnoreCase("q")) {
  try {
    System.out.println("Enter the full path to add into the index (q=quit): (e.g. /home/ron/mydir or c:\Users\ron\mydir)");
    System.out.println("[Acceptable file types: .xml, .html, .html, .txt]");
    s = br.readLine();
    if (s.equalsIgnoreCase("q")) {
      break;
    }

    indexer.indexFileOrDirectory(s);
  } catch (Exception e) {
    System.out.println("Error indexing " + s + " : " + e.getMessage());
  }
}

indexer.closeIndex();

IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(indexLocation)));
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(5, true);

s = "";
while (!s.equalsIgnoreCase("q")) {
  try {
    System.out.println("Enter the search query (q=quit):");
    s = br.readLine();
    if (s.equalsIgnoreCase("q")) {
      break;
    }
    Query q = new QueryParser(Version.LUCENE_40, "contents", analyzer).parse(s);
    searcher.search(q, collector);
    ScoreDoc[] hits = collector.topDocs().scoreDocs;

    // 4. display results
    System.out.println("Found " + hits.length + " hits.");
    for(int i=0;i<hits.length;++i) {
      int docId = hits[i].doc;
      Document d = searcher.doc(docId);
      System.out.println((i + 1) + ". " + d.get("path") + " score=" + hits[i].score);
    }

  } catch (Exception e) {
    System.out.println("Error searching " + s + " : " + e.getMessage());
  }
}

  }

  /**
  * Constructor
  * @param indexDir the name of the folder in which the index should be created
  * @throws java.io.IOException when exception creating index.
  */
  TextFileIndexer(String indexDir) throws IOException {

FSDirectory dir = FSDirectory.open(new File(indexDir));


IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer);

writer = new IndexWriter(dir, config);
  }

  /**
 * Indexes a file or directory
 * @param fileName the name of a text file or a folder we wish to add to the index
 * @throws java.io.IOException when exception
 */
  public void indexFileOrDirectory(String fileName) throws IOException {

addFiles(new File(fileName));

int originalNumDocs = writer.numDocs();
for (File f : queue) {
  FileReader fr = null;
  try {
    Document doc = new Document();

    fr = new FileReader(f);
    doc.add(new TextField("contents", fr));
    doc.add(new StringField("path", f.getPath(), Field.Store.YES));
    doc.add(new StringField("filename", f.getName(), Field.Store.YES));

    writer.addDocument(doc);
    System.out.println("Added: " + f);
  } catch (Exception e) {
    System.out.println("Could not add: " + f);
  } finally {
    fr.close();
  }
}

 int newNumDocs = writer.numDocs();
 System.out.println("");
 System.out.println("************************");
 System.out.println((newNumDocs - originalNumDocs) + " documents added.");
 System.out.println("************************");

 queue.clear();
}

 private void addFiles(File file) {

 if (!file.exists()) {
   System.out.println(file + " does not exist.");
 }
 if (file.isDirectory()) {
   for (File f : file.listFiles()) {
     addFiles(f);
   }
 } else {
   String filename = file.getName().toLowerCase();

   if (filename.endsWith(".htm") || filename.endsWith(".html") ||
          filename.endsWith(".xml") || filename.endsWith(".txt")) {
     queue.add(file);
   } else {
     System.out.println("Skipped " + filename);
   }
  }
 }

  public void closeIndex() throws IOException {
   writer.close();
  }
 }
import org.apache.lucene.analysis.standard.StandardAnalyzer;
导入org.apache.lucene.document.document;
导入org.apache.lucene.document.Field;
导入org.apache.lucene.document.StringField;
导入org.apache.lucene.document.TextField;
导入org.apache.lucene.index.DirectoryReader;
导入org.apache.lucene.index.IndexReader;
导入org.apache.lucene.index.IndexWriter;
导入org.apache.lucene.index.IndexWriterConfig;
导入org.apache.lucene.queryparser.classic.queryparser;
导入org.apache.lucene.search.indexsearch;
导入org.apache.lucene.search.Query;
导入org.apache.lucene.search.ScoreDoc;
导入org.apache.lucene.search.TopScoreDocCollector;
导入org.apache.lucene.store.FSDirectory;
导入org.apache.lucene.util.Version;
导入java.io.*;
导入java.util.ArrayList;
公共类TextFileIndexer{
专用静态StandardAnalyzer=新的StandardAnalyzer(版本.LUCENE_40);
私人索引作者;
私有ArrayList队列=新建ArrayList();
公共静态void main(字符串[]args)引发IOException{
System.out.println(“输入创建索引的路径:(例如/tmp/index或c:\temp\index)”;
字符串indexLocation=null;
BufferedReader br=新的BufferedReader(
新的InputStreamReader(System.in));
字符串s=br.readLine();
TextFileIndexer indexer=null;
试一试{
索引位置=s;
索引器=新的TextFileIndexer;
}捕获(例外情况除外){
System.out.println(“无法创建索引…”+ex.getMessage());
系统退出(-1);
}
而(!s.equalsIgnoreCase(“q”)){
试一试{
System.out.println(“输入要添加到索引中的完整路径(q=quit):(例如/home/ron/mydir或c:\Users\ron\mydir)”;
System.out.println(“[可接受的文件类型:.xml、.html、.html、.txt]”);
s=br.readLine();
如果(s.equalsIgnoreCase(“q”)){
打破
}
索引器。索引文件目录;
}捕获(例外e){
System.out.println(“错误索引”+s+:“+e.getMessage());
}
}
indexer.closeIndex();
IndexReader=DirectoryReader.open(FSDirectory.open(新文件(indexLocation));
IndexSearcher search=新的IndexSearcher(阅读器);
TopScoreDocCollector=TopScoreDocCollector.create(5,true);
s=“”;
而(!s.equalsIgnoreCase(“q”)){
试一试{
System.out.println(“输入搜索查询(q=quit):”;
s=br.readLine();
如果(s.equalsIgnoreCase(“q”)){
打破
}
Query q=新的QueryParser(Version.LUCENE_40,“contents”,analyzer);
搜索者。搜索(q,收集器);
ScoreDoc[]hits=collector.topDocs().scoreDocs;
//4.显示结果
System.out.println(“Found”+hits.length+“hits.”);

对于(int i=0;i我已检查了您的代码。您只需在方法
search
之前的循环中实例化
TopScoreDocCollector
。下面是您的代码片段,其中包含我更改代码的注释:

...       

    //REMOVE AND INSTANTIATE IN THE CYCLE!      TopScoreDocCollector collector = TopScoreDocCollector.create ( 5, true );

                    s = "";
                    while ( !s.equalsIgnoreCase ( "q" ) ) {
                        try {
                            System.out.println ( "Enter the search query (q=quit):" );
                            s = br.readLine ();
                            if ( s.equalsIgnoreCase ( "q" ) ) {
                                break;
                            }
                            // INTANTIATE HERE!!!
                            TopScoreDocCollector collector = TopScoreDocCollector.create ( 5, true );

                            Query q = new QueryParser ( Version.LUCENE_40, "contents", analyzer ).parse ( s );
                            searcher.search ( q, collector );

...
否则,您可以使用方法
search
的另一个签名,并明确删除
TopScoreDocCollector
的显式实例。例如:

TopDocs topDocs = searcher.search ( q, 5);
ScoreDoc[] hits = topDocs.scoreDocs;

我想你可以解决你的问题。

你能在第二次搜索中粘贴你的异常吗?正如srs所说,异常是什么是必要的信息。不过,请不要将你的代码放在屏幕截图中。将其粘贴到问题中。如果你让我们从屏幕截图中重新键入你的代码以尝试调试它,没有人会打扰。对不起,这是我第一次问stackoverflow问题。例外是java.lang.NullPointerException。我用代码编辑了我的帖子。我分析了你的代码并找到了解决方案。请看我的答案:)哦,谢谢,非常感谢。这对我帮助很大。