1、工具类LuceneUtils
LuceneUtils.java
package com.rk.lucene.utils; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.apache.commons.beanutils.BeanUtils; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.Field.Index; import org.apache.lucene.document.Field.Store; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.index.IndexWriter.MaxFieldLength; 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.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import org.junit.Test; import com.rk.lucene.entity.Article; import com.rk.lucene.entity.Page; public class LuceneUtils { private static Directory directory; private static Version version; private static Analyzer analyzer; private static MaxFieldLength maxFieldLength; private static final String LUCENE_DIRECTORY= "D:/rk/indexDB"; static{ try { directory = FSDirectory.open(new File(LUCENE_DIRECTORY)); version = Version.LUCENE_30; analyzer = new StandardAnalyzer(version); maxFieldLength = MaxFieldLength.LIMITED; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } //不让外部new当前帮助类的对象 private LuceneUtils(){} public staticvoid pagination(Page page,String field,String keyword,Class clazz) throws Exception{ QueryParser queryParser = new QueryParser(getVersion(), field, getAnalyzer()); Query query = queryParser.parse(keyword); IndexSearcher indexSearcher = new IndexSearcher(getDirectory()); TopDocs topDocs = indexSearcher.search(query, 200); int totalHits = topDocs.totalHits; int curPage = page.getCurPage(); int pageSize = page.getPageSize(); int quotient = totalHits / pageSize; int remainder = totalHits % pageSize; int totalPages = remainder==0 ? quotient : quotient+1; int startIndex = (curPage-1) * pageSize; int stopIndex = Math.min(startIndex + pageSize, totalHits); List list = page.getItems(); if(list == null){ list = new ArrayList (); page.setItems(list); } list.clear(); for(int i=startIndex;i void add(T t) throws Exception{ Document document = javabean2document(t); IndexWriter indexWriter = new IndexWriter(getDirectory(), getAnalyzer(), getMaxFieldLength()); indexWriter.addDocument(document); indexWriter.close(); } public static void addAll(List list) throws Exception{ IndexWriter indexWriter = new IndexWriter(getDirectory(), getAnalyzer(), getMaxFieldLength()); for(T t : list){ Document doc = javabean2document(t); indexWriter.addDocument(doc); } indexWriter.close(); } public static void update(String field,String value,T t) throws Exception{ Document document = javabean2document(t); IndexWriter indexWriter = new IndexWriter(getDirectory(), getAnalyzer(), getMaxFieldLength()); indexWriter.updateDocument(new Term(field,value), document); indexWriter.close(); } public static void delete(String field,String value) throws Exception{ IndexWriter indexWriter = new IndexWriter(getDirectory(), getAnalyzer(), getMaxFieldLength()); indexWriter.deleteDocuments(new Term(field,value)); indexWriter.close(); } /** * 删除所有记录 */ public static void deleteAll() throws Exception { IndexWriter indexWriter = new IndexWriter(getDirectory(), getAnalyzer(), getMaxFieldLength()); indexWriter.deleteAll(); indexWriter.close(); } /** * 根据关键字进行搜索 */ public static List search(String field,String keyword,int topN) throws Exception{ List list = new ArrayList (); QueryParser queryParser = new QueryParser(getVersion(), field, getAnalyzer()); Query query = queryParser.parse(keyword); IndexSearcher indexSearcher = new IndexSearcher(getDirectory()); TopDocs topDocs = indexSearcher.search(query, topN); for(int i=0;i void printList(List list){ if(list != null && list.size()>0){ for(T t : list){ System.out.println(t); } } } //将JavaBean转成Document对象 public static Document javabean2document(Object obj) throws Exception{ //创建Document对象 Document document = new Document(); //获取obj引用的对象字节码 Class clazz = obj.getClass(); //通过对象字节码获取私有的属性 java.lang.reflect.Field[] reflectFields = clazz.getDeclaredFields(); //迭代 for(java.lang.reflect.Field reflectField : reflectFields){ //反射 reflectField.setAccessible(true); //获取字段名 String name = reflectField.getName(); //获取字段值 String value = reflectField.get(obj).toString(); //加入到Document对象中去,这时javabean的属性与document对象的属性相同 document.add(new Field(name, value, Store.YES, Index.ANALYZED)); } //返回document对象 return document; } //将Document对象转换成JavaBean对象 public static T document2javabean(Document document,Class clazz) throws Exception{ T obj = clazz.newInstance(); java.lang.reflect.Field[] reflectFields = clazz.getDeclaredFields(); for(java.lang.reflect.Field reflectField : reflectFields){ reflectField.setAccessible(true); String name = reflectField.getName(); String value = document.get(name); BeanUtils.setProperty(obj, name, value); } return obj; } public static Directory getDirectory() { return directory; } public static void setDirectory(Directory directory) { LuceneUtils.directory = directory; } public static Version getVersion() { return version; } public static void setVersion(Version version) { LuceneUtils.version = version; } public static Analyzer getAnalyzer() { return analyzer; } public static void setAnalyzer(Analyzer analyzer) { LuceneUtils.analyzer = analyzer; } public static MaxFieldLength getMaxFieldLength() { return maxFieldLength; } public static void setMaxFieldLength(MaxFieldLength maxFieldLength) { LuceneUtils.maxFieldLength = maxFieldLength; } //测试 public static void main(String[] args) throws Exception { Article article = new Article(1, "你好", "欢迎来到我的世界"); Document document = javabean2document(article); Article a2 = (Article) document2javabean(document, Article.class); System.out.println(a2); } }
2、entity->dao->service->action
Article.java
package com.rk.lucene.entity; public class Article { private Integer id; private String title;//标题 private String content;//内容 public Article() { } public Article(Integer id, String title, String content) { this.id = id; this.title = title; this.content = content; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } @Override public String toString() { return "Article [编号=" + id + ", 标题=" + title + ", 内容=" + content + "]"; } }
ArticleDao.java
package com.rk.lucene.dao; import com.rk.lucene.entity.Article; import com.rk.lucene.entity.Page; import com.rk.lucene.utils.LuceneUtils; public class ArticleDao { public void pagination(Pagepage,String keyword) throws Exception{ LuceneUtils.pagination(page, "content", keyword, Article.class); } }
ArticleService.java
package com.rk.lucene.service; import com.rk.lucene.dao.ArticleDao; import com.rk.lucene.entity.Article; import com.rk.lucene.entity.Page; public class ArticleService { private ArticleDao dao = new ArticleDao(); public Pagepagination(String keyword,int curPage,int pageSize) throws Exception { Page page = new Page (); page.setCurPage(curPage); page.setPageSize(pageSize); dao.pagination(page, keyword); return page; } }
ArticleServlet.java
package com.rk.lucene.action; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.rk.lucene.entity.Article; import com.rk.lucene.entity.Page; import com.rk.lucene.service.ArticleService; public class ArticleServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { request.setCharacterEncoding("UTF-8"); //获取关键字(此处并不完善,没有对关键字的有效性进行校验) String keyword = request.getParameter("keyword"); String strPageNo = request.getParameter("pageNo"); //只有当页码真实存在时,才进行查询 if(strPageNo != null && !"".equals(strPageNo)){ int curPage = Integer.parseInt(strPageNo); //调用业务层 ArticleService service = new ArticleService(); Pagepage = service.pagination(keyword, curPage, 2); //将Page对象绑定到request域对象中 request.setAttribute("PAGE", page); } //将keywords变量绑定到request域对象中 request.setAttribute("KEYWORD", keyword); //转发到list.jsp页面 request.getRequestDispatcher("/index.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } }
在web.xml中注册ArticleServlet
lucene01 index.jsp ArticleServlet com.rk.lucene.action.ArticleServlet ArticleServlet /article
3、前台index.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>同步分页
编号 | 标题 | 内容 |
---|---|---|
${article.id} | ${article.title} | ${article.content } |
|
遇到的一个问题 |
Exception in thread "main" org.apache.lucene.queryParser.ParseException: Encountered " 可能是代码写错了。 错误的代码: Query query = queryParser.Query(keyword); 正确的代码: Query query = queryParser.parse(keyword); |