Apache Can';t在Lucene搜索中再次搜索同一个单词
我是Lucene的新手,所以我从下载了一个示例。 代码目前可以工作,但是,我认为我没有正确地使用Lucene。我可以第一次搜索一个单词(例如:is student),但是在那之后(仍然在循环中),如果我搜索同一个单词,它将返回一个异常。(java.lang.NullPointerException) 请帮我修一下 这是密码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.
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。我用代码编辑了我的帖子。我分析了你的代码并找到了解决方案。请看我的答案:)哦,谢谢,非常感谢。这对我帮助很大。