Java 如何使用ApacheLucene为全文搜索提供fsdirectory的web inf文件夹路径
我对ApacheLucene非常陌生。在这里,我尝试开发一个示例全文搜索应用程序,它将使用给定的输入查询在html文件中搜索,如果在任何文件中找到给定的字符串,则创建索引 我的结果jsp页面如下所示: 若我点击任何超链接,那个么html文件需要在新选项卡中打开,但我得到的是空白页面 这是我的应用程序文件夹结构 这是我的代码:Java 如何使用ApacheLucene为全文搜索提供fsdirectory的web inf文件夹路径,java,jsp,lucene,web-inf,Java,Jsp,Lucene,Web Inf,我对ApacheLucene非常陌生。在这里,我尝试开发一个示例全文搜索应用程序,它将使用给定的输入查询在html文件中搜索,如果在任何文件中找到给定的字符串,则创建索引 我的结果jsp页面如下所示: 若我点击任何超链接,那个么html文件需要在新选项卡中打开,但我得到的是空白页面 这是我的应用程序文件夹结构 这是我的代码: protected void doPost(HttpServletRequest request, HttpServletResponse response)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String query=request.getParameter("squery");
String path1= "C:/POC/indexs/";
System.out.println(path1);
String path2 = request.getContextPath()+"/WEB-INF/Html-Files";
File indexDir = new File(path1);
int hits = 100;
FilesTextFinder createIndex=new FilesTextFinder();
File dataDir = new File(path2);
String suffix = "html";
try
{
boolean iscreated=isIndexCreated(indexDir, query, hits);
if(!iscreated)
{
System.out.println("no indexs found...");
int numIndex = createIndex.index(indexDir, dataDir, suffix);
System.out.println("Total Indexs: "+numIndex);
}
searchIndex(indexDir, query, hits);
RequestDispatcher rd=request.getRequestDispatcher("/Results.jsp");
request.setAttribute("results", values);
request.setAttribute("query", query);
rd.forward(request, response);
}
catch (Exception e)
{
e.printStackTrace();
}
}
private void searchIndex(File indexDir, String queryStr, int maxHits) throws Exception
{
Directory directory = FSDirectory.open(indexDir);
DirectoryReader dreader=DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(dreader);
QueryParser parser = new QueryParser("contents",new SimpleAnalyzer());
Query query = parser.parse(queryStr);
TopDocs topDocs = searcher.search(query, maxHits);
ScoreDoc[] hits = topDocs.scoreDocs;
int count=hits.length;
values=new HashMap<String, String>();
for (int i = 0; i<count; i++)
{
int docId = hits[i].doc;
Document d = searcher.doc(docId);
String cmpt_path=d.get("filename");
int indx=cmpt_path.lastIndexOf("\\");
String name=cmpt_path.substring(indx+1,cmpt_path.length());
if(name.length()>40)
{
name=name.substring(0, 40);
}
System.out.println("name: "+name);
values.put(name, cmpt_path);
}
System.out.println("Found " + hits.length);
}
private boolean isIndexCreated(File indexDir, String queryStr, int maxHits) throws Exception
{
Directory directory = FSDirectory.open(indexDir);
System.out.println("---------"+indexDir);
DirectoryReader dreader=DirectoryReader.open(directory);//here i am getting error
IndexSearcher searcher = new IndexSearcher(dreader);
QueryParser parser = new QueryParser("contents",new SimpleAnalyzer());
Query query = parser.parse(queryStr);
TopDocs topDocs = searcher.search(query, maxHits);
ScoreDoc[] hits = topDocs.scoreDocs;
int count=hits.length;
System.out.println("called..."+count);
directory.close();
if(count>0)
return true;
else
return false;
}
}
protectedvoiddopost(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException
{
字符串查询=request.getParameter(“squery”);
字符串path1=“C:/POC/indexs/”;
System.out.println(路径1);
字符串路径2=request.getContextPath()+“/WEB-INF/Html文件”;
File indexDir=新文件(路径1);
int hits=100;
FileTextFinder createIndex=新建FileTextFinder();
文件dataDir=新文件(路径2);
字符串后缀=“html”;
尝试
{
布尔值iscreated=isIndexCreated(indexDir、query、hits);
如果(!已创建)
{
System.out.println(“未找到索引…”);
int numIndex=createIndex.index(indexDir,dataDir,后缀);
System.out.println(“总指数:“+numIndex”);
}
搜索索引(索引、查询、点击);
RequestDispatcher rd=request.getRequestDispatcher(“/Results.jsp”);
setAttribute(“结果”,值);
setAttribute(“查询”,查询);
转发(请求、响应);
}
捕获(例外e)
{
e、 printStackTrace();
}
}
私有void searchIndex(文件indexDir、字符串queryStr、int maxits)引发异常
{
Directory=FSDirectory.open(indexDir);
DirectoryReader dreader=DirectoryReader.open(目录);
索引搜索器searcher=新索引搜索器(恐惧者);
QueryParser parser=newqueryparser(“contents”,newsimpleanalyzer());
Query=parser.parse(queryStr);
TopDocs TopDocs=searcher.search(查询,最大点击次数);
ScoreDoc[]点击次数=topDocs.scoreDocs;
int count=hits.length;
values=newhashmap();
对于(int i=0;i40)
{
name=name.substring(0,40);
}
System.out.println(“名称:”+name);
value.put(名称、cmpt_路径);
}
System.out.println(“找到”+点击数长度);
}
私有布尔isIndexCreated(文件indexDir、字符串queryStr、int maxHits)引发异常
{
Directory=FSDirectory.open(indexDir);
System.out.println(“-----------”+indexDir);
DirectoryReader-dreader=DirectoryReader.open(directory);//这里有一个错误
索引搜索器searcher=新索引搜索器(恐惧者);
QueryParser parser=newqueryparser(“contents”,newsimpleanalyzer());
Query=parser.parse(queryStr);
TopDocs TopDocs=searcher.search(查询,最大点击次数);
ScoreDoc[]点击次数=topDocs.scoreDocs;
int count=hits.length;
System.out.println(“调用…”+计数);
close()目录;
如果(计数>0)
返回true;
其他的
返回false;
}
}
如何将包含文件夹路径的html文件(即WEB-INF/html文件)传递到FSDirectory类,以及当我点击结果页中的任何超链接时,需要在浏览器的“新建”选项卡中打开相应的html文件
我怎样才能做到这一点
提前感谢…尝试在运行时向WEB-INF添加内容是个坏主意。通常,它被打包到WAR中,而不是文件系统上的简单目录。改为使路径可配置(通过JNDI或简单的.properties文件),并使用外部的实际文件系统路径application@kaqqao谢谢你的帮助。我一定会按照你的建议做些改变。