web api之使用lucene构造的search函数

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;
	}
}


第一次发技术贴,有点羞涩,哈哈哈。还望多多指正。

猜你喜欢

转载自blog.csdn.net/weixin_37726222/article/details/79705070