package api;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.*;
import org.apache.lucene.index.IndexReader;
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.TopDocs;
import org.apache.lucene.store.FSDirectory;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Webs extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Webs() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
String webName = request.getParameter("webName");
String field = request.getParameter("field");
String pageSize = request.getParameter("pageSize");
String pageNum = request.getParameter("pageNum");
String keyword = request.getParameter("keyword");
/*
* 与数据库交互
*/
/*
* 将数据库查询结果序列化成json数据,存储于ans中;
*/
//接下来用上述参数进行查询,调用lucene包 函数,在index基础上进行search,写一个search函数,,search结果保存在ans中。
if(keyword==null) {
String temp =Search1(webName, field, pageSize, pageNum, keyword);
PrintWriter writer= response.getWriter();
writer.print(temp);
return;
}
else{
String ans =Search2(webName, field, pageSize, pageNum);
PrintWriter writer = response.getWriter();
writer.print(ans);
return;
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
//接下来用上述参数进行查询,调用lucene包 函数,在index基础上进行search,写一个search函数,,search结果保存在ans中。
//用户指定pagesize,(也就是每一页的doc)的数量。
public static String Search1(String webName11,String field11,String pageSize11,String pageNum11,String keyword) {
try {
String ans=null;
//1、创建Directory
FSDirectory directory = FSDirectory.open(Paths.get("index_path"));
//2、根据directory创建indexReader
IndexReader Reader = DirectoryReader.open(directory);
//3、根据indexReader创建indexSearcher
IndexSearcher Searcher = new IndexSearcher(Reader);
//4、创建搜索的Query
//创建parser来确定搜索文件的内容,第二个参数便是搜索的域
QueryParser parser = new QueryParser(field11,new StandardAnalyzer());
//创建query,表示搜索的域为context中的java的文档 。
Query query = parser.parse(keyword);
//5、根据searcher搜索并且返回TopDocs
TopDocs tds = Searcher.search(query, 1000000);
//6、根据TopDocs获取ScordDoc对象获取具体的Document对象
ScoreDoc[] sds = tds.scoreDocs;
List<Document>documents=new ArrayList<>();
for(ScoreDoc scoreDoc : sds){//for(int i:数组名)
//7、根据searcher和ScordDoc对象获取具体的Document对象
Document d = Searcher.doc(scoreDoc.doc);
documents.add(d);
int itemnum=documents.indexOf(d);
Field field=(Field)d.getField("keyword");
String data=field.stringValue();
int curPage=Integer.parseInt(pageNum11);
int docTotal=documents.size();
int totalItemNum=docTotal;
int pageSize=Integer.parseInt(pageSize11);
int totalPage=docTotal/pageSize;
api.jsonobj.searchByKeyword obj=new api.jsonobj.searchByKeyword(webName11,field.toString(),String.valueOf(curPage),String.valueOf(totalPage),String.valueOf(totalItemNum),String.valueOf(itemnum),data);
ObjectMapper maper=new ObjectMapper();
ans=ans+maper.writeValueAsString(obj);
}
Reader.close();
return ans;
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static String Search2(String webName11,String field11,String pageSize11,String pageNum11) {
String ans=null;
try {
//1、创建Directory
FSDirectory directory = FSDirectory.open(Paths.get("index_path"));
//2、根据directory创建indexReader
IndexReader Reader = DirectoryReader.open(directory);
int Reader_length=Reader.numDocs();
for(int i=0;i<Reader_length;i++) {
Document document=Reader.document(i);
int itemnum=i;
Field field=(Field)document.getFields();
String data=field.stringValue();
int curPage=Integer.parseInt(pageNum11);
int totalItemNum=Reader_length;
int pageSize=Integer.parseInt(pageSize11);
int totalPage=totalItemNum/pageSize;
api.jsonobj.searchByKeyword obj=new api.jsonobj.searchByKeyword(webName11,field.toString(),String.valueOf(curPage),String.valueOf(totalPage),String.valueOf(totalItemNum),String.valueOf(itemnum),data);
ObjectMapper maper=new ObjectMapper();
ans=ans+maper.writeValueAsString(obj);
}
//9、关闭reader
Reader.close();
return ans;
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package api.jsonobj;
public class searchByKeyword {
private String webName;
private String field;
private String curPage;
private String totalPage;
private String totalItemNum;
private String itemNum;
private String data;
public searchByKeyword(String webName,String field,String curPage,String totalPage,String totalItemNum,String itemNum,String data) {
// TODO Auto-generated constructor stub
this.webName=webName;
this.field=field;
this.curPage=curPage;
this.totalPage=totalPage;
this.totalItemNum=totalItemNum;
this.itemNum=itemNum;
this.data=data;
}
public String getWebName() {
return webName;
}
public String getField() {
return field;
}
public String getCurPage() {
return curPage;
}
public String getTotalPage() {
return totalPage;
}
public String getTotalItemNum() {
return totalItemNum;
}
public String getData() {
return data;
}
public String getItemNum() {
return itemNum;
}
public void setItemNum(String itemNum) {
this.itemNum = itemNum;
}
public void setWebName(String webName) {
this.webName = webName;
}
public void setField(String field) {
this.field = field;
}
public void setCurPage(String curPage) {
this.curPage = curPage;
}public void setData(String data) {
this.data = data;
}
public void setTotalItemNum(String totalItemNum) {
this.totalItemNum = totalItemNum;
}
public void setTotalPage(String totalPage) {
this.totalPage = totalPage;
}
}
第一次发技术贴,有点羞涩,哈哈哈。还望多多指正。