系统为linux 使用eclipse进行开发,服务器为Tomcat 5.5在eclipse中对数据库进行了索引,使用存放在磁盘,并且存放在src包下面的res/index/product目录中我想在JSP页面中提供一个文本框进行搜索,然后返回搜索结果,现在出现的问题是在JSP页面上输入查询内容进行查询时获取不到索引目录,目录位置错误错误代码java.io.FileNotFoundException: no segments* file found in org.apache.lucene.store.FSDirectory@/home/long/src/res/index/product: files:
at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:604)
at org.apache.lucene.index.DirectoryIndexReader.open(DirectoryIndexReader.java:115)
at org.apache.lucene.index.IndexReader.open(IndexReader.java:316)
at org.apache.lucene.index.IndexReader.open(IndexReader.java:206)
at fun.search.SearchInLucene.SearchProductInLucene(SearchInLucene.java:114)
at biz.impl.ProductBizImpl.SearchProductsByParm(ProductBizImpl.java:185)
at action.ProductAction.searchProductByParm(ProductAction.java:107)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
at org.apache.struts.actions.MappingDispatchAction.execute(MappingDispatchAction.java:169)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:595)
总是在/home下面开始找请问如何定义索引目录可以相对于web项目目录,而不是一个绝对的路径下面是我的代码,麻烦大家看一下,谢了!!这里我是设定了一个配置文件,定义文件存放的目录,
现在设定的是ProductProductIndexDir=./src/res/index/product
SearchInLucene.java package fun.search;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;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.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocCollector;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.store.LockObtainFailedException;import biz.ProductBiz;
import biz.impl.ProductBizImpl;
import dao.ProductDao;
import dao.impl.ProductDaoImpl;
import entity.Product;
/**
 * 使用Lucene查询数据库数据的所有操作
 * @author long
 *
 */
public class SearchInLucene {
/**
 * 初始化目录配置文件
 */
private static Properties info=new Properties();
/**
 * 读取配置文件
 */
static{
try {
InputStream is=SearchInLucene.class.getResourceAsStream("/res/IndexDir.properties");
info.load(is);
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
throw new ExceptionInInitializerError(e);
}
}
/**
 * 建立产品索引
 */
public static void ProductIndexBuild(){
String dir=info.getProperty("ProductIndexDir");
IndexWriter write=null;
try {
write = new IndexWriter(dir,new StandardAnalyzer(),true,IndexWriter.MaxFieldLength.LIMITED);
} catch (CorruptIndexException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (LockObtainFailedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//write.setUseCompoundFile(false);
ProductDao pd=new ProductDaoImpl();
ProductBiz pb=new ProductBizImpl(pd);
Collection<Product> coll=pb.listAllProducts();
try {
coll =pd.getAllProduct();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Document doc=null;
for(Product product:coll){
doc=new Document();
doc.add(new Field("id",String.valueOf(product.getId()), Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.YES));
doc.add(new Field("name", String.valueOf(product.getName()), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
doc.add(new Field("description",product.getDescription(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
doc.add(new Field("price",String.valueOf(product.getPrice()),Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.YES));
try {
write.addDocument(doc);
} catch (CorruptIndexException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
write.close();
} catch (CorruptIndexException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
 * 通过关键字查询商品
 * @param parm 关键字
 * @return 商品集合
 */
public static Collection<Product> SearchProductInLucene(String parm){
String dir=info.getProperty("ProductIndexDir");
Collection<Product> coll=new ArrayList<Product>();
try {
IndexReader reader = IndexReader.open(dir);
IndexSearcher search = new IndexSearcher(reader);
QueryParser parser = new QueryParser("name", new StandardAnalyzer());
/* System.out.println("Please input word:");
Scanner sc=new Scanner(System.in);
String word=sc.next();*/
//Query query =parser.parse(parm+"~");
Query query = new WildcardQuery(new Term("name", "*"+parm+"*"));;
TopDocCollector collector = new TopDocCollector(100);  
search.search(query,collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
int numTotalHits = collector.getTotalHits();
System.out.println("TOTAL:"+numTotalHits);

for(int i=0;i<numTotalHits;i++){
Document doc=new Document();
   doc = search.doc(hits[i].doc);
   /**
    * 创建商品对象并放入集合
    */
   Product pro=new Product();
   pro.setId(Integer.valueOf(doc.get("id")));
   pro.setName(doc.get("name"));
   pro.setDescription(doc.get("description"));
   pro.setPrice(Double.valueOf(doc.get("price")));
   coll.add(pro);
    }
  } catch (Exception e) {
  e.printStackTrace();
   }

  return coll;

}
}

解决方案 »

  1.   

    用ServletContext的getRealPath方法得到发布目录的绝对路径
      

  2.   

    java.io.FileNotFoundException: no segments* file found in org.apache.lucene.store.FSDirectory我是存放在磁盘上的 FSDirectory,
    每次获取的时候都是在磁盘上读,我的意思是读取服务器端的索引目录
    应该怎么操作啊如果数据量小可以放在内存,可是如果数据太大放在内存中显然不合适啊现在生成的索引在项目下面src/res/index/product,生成的也就在Tomcat下面的classes下面了,和众多类方一起的,可是怎么获取呢?在lucene中没有获取服务器端目录索引的类啊..请各位高手帮忙了..
      

  3.   

    自给再顶一下,开源框架中没有用lucene的么?还是我发错地方了...