最近将全文检索的程序从windows平台移植到linux平台中,发现了一个问题:
搜索时总是报如下错误:
[code="java"]
java.io.FileNotFoundException: no segments* file found in org.apache.lucene.store.FSDirectory@/usr/local/holendb: files:
at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:516)
at org.apache.lucene.index.IndexReader.open(IndexReader.java:221)
at org.apache.lucene.index.IndexReader.open(IndexReader.java:148)
at asop.lucene.SearchByLucene.getHighLightResult(SearchByLucene.java:62)
。。。。。。。
[/code]
但是在/usr/local/holendb的目录下有如下的文件:
-rw-r--r-- 1 root root 34822300 04-20 13:33 _1p3b.cfs
-rw-r--r-- 1 root root 44 04-20 13:33 segments_3e6w
-rw-r--r-- 1 root root 20 04-20 13:33 segments.gen
我将这些文件拷贝到windows平台中的索引目录中运行搜索程序,可以正常使用,查处结果。这是什么问题呢?请教各位大大了
[b]问题补充:[/b]
路径是正确的
[b]问题补充:[/b]
我的建立索引的方法如下:
[code="java"]
public int createDataBase(File file, boolean newOrAppend) {
int returnValue = 0;
if (!file.isDirectory()) {
file.mkdirs();
}
try {
MyPaoding pp = MyPaoding.getInstance();
Analyzer writerAnalyzer = PaodingAnalyzer.writerMode(pp
.getPaoDing());
IndexWriter indexWriter = new IndexWriter(file,
writerAnalyzer, newOrAppend);
indexWriter.close();
returnValue = 1;
} catch (Exception ex) {
ex.printStackTrace();
}
return returnValue;
}
/**
*
* 传入检索库路径,初始化库
*
* @param file
*
* @return
*
*/
public int createDataBase(String file) {
return this.createDataBase(new File(file), true);
}
[/code]
插入数据的方法
[code="java"]
/**
* 创建全文索引
*
* @param dbpath
* 索引文件的位置
* @param map
* 创建索引的索引数据
* @return
*/
@SuppressWarnings("unchecked")
public int insertRecords(String dbpath, HashMap map) {
int returnValue = 0;
try {
MyPaoding pp = MyPaoding.getInstance();
Analyzer writerAnalyzer = PaodingAnalyzer.writerMode(pp
.getPaoDing());
IndexWriter indexWriter = new IndexWriter(dbpath, writerAnalyzer,
false);
//Directory dir = FSDirectory.getDirectory(dbpath,false);//
this.addMap(indexWriter, map);
returnValue = 1;
} catch (Exception ex) {
ex.printStackTrace();
log.error(ex);
}
return returnValue;
}
/**
* 创建索引
*
* @param indexWriter
* @param map
*/
@SuppressWarnings("unchecked")
private void addMap(IndexWriter indexWriter, HashMap map) {
Document doc = new Document();
try {
Set entries = map.entrySet();
if (entries == null)
throw new Exception("空数据");
Iterator iterator = entries.iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
Object value;
Object key = entry.getKey();
if(entry.getValue()==null){
value = extractText("");
}
else{
value = extractText(entry.getValue().toString());}
if (!key.toString().equals("content")) {
Field fd = new Field(key.toString(), value.toString(),
Field.Store.YES, Field.Index.NO,
Field.TermVector.NO);
doc.add(fd);
} else {
Field fd = new Field(key.toString(), value.toString(),
Field.Store.YES, Field.Index.TOKENIZED,
Field.TermVector.WITH_POSITIONS_OFFSETS);
doc.add(fd);
}
}
indexWriter.addDocument(doc);
indexWriter.optimize();
indexWriter.close();
} catch (Exception ex) {
ex.printStackTrace();
log.error(ex);
}
}
[/code]
搜索的方法:
[code="java"]
MyPaoding pp = MyPaoding.getInstance();
FSDirectory fsdir = FSDirectory.getDirectory(term.getDbpath());
IndexReader reader = IndexReader.open(fsdir);
QueryParser parser = new QueryParser(term.getQueryFieldName(),
PaodingAnalyzer.writerMode(pp.getPaoDing()));
Query query = parser.parse(term.getQueryString());
Searcher searcher = new IndexSearcher(term.getDbpath());
query = query.rewrite(reader);
Hits hits = searcher.search(query);
[/code]
现在报错的地方是:IndexReader reader = IndexReader.open(fsdir);