util
public class LuceneUtil { PRivate static Directory directory; private static Version version; private static Analyzer analyzer; private static MaxFieldLength maxFieldLength; static{ try { directory = FSDirectory.open(new File("c:/itcast/IndexDBDBDB")); version = Version.LUCENE_30; analyzer = new StandardAnalyzer(version); maxFieldLength = MaxFieldLength.LIMITED; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } public static Directory getDirectory() { return directory; } public static Version getVersion() { return version; } public static Analyzer getAnalyzer() { return analyzer; } public static MaxFieldLength getMaxFieldLength() { return maxFieldLength; } //不讓外界new該幫助類 private LuceneUtil(){} //將javaBean轉成Document對象 public static Document javabean2document(Object obj) throws Exception{ //創建Docuemnt對象 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); //獲取屬性名,id/title/content String name = reflectField.getName(); //人工拼接方法名 String methodName = "get" + name.substring(0,1).toUpperCase()+name.substring(1); //獲取方法,例如:getId()/getTitle()/getContent() Method method = clazz.getMethod(methodName,null); //執行方法 String value = method.invoke(obj,null).toString(); //加入到Document對象中去,這時javabean的屬性與document對象的屬性相同 document.add(new Field(name,value,Store.YES,Index.ANALYZED)); } //返回document對象 return document; } //將Document對象轉成JavaBean對象 public static Object document2javabean(Document document,Class clazz) throws Exception{ Object obj = clazz.newInstance(); java.lang.reflect.Field[] reflectFields = clazz.getDeclaredFields(); for(java.lang.reflect.Field reflectField : reflectFields){ reflectField.setAccessible(true); String name = reflectField.getName();//id/title/content String value = document.get(name);//1/培訓/傳智是一家培訓機構 BeanUtils.setProperty(obj,name,value);//封裝javabean對應的屬性中去,通過setXxx()方法 } return obj; }curdpublic class ArticleDao { @Test public void add() throws Exception{ Article article = new Article(1,"培訓","中大是一家java培訓機構"); Document document = LuceneUtil.javabean2document(article); IndexWriter indexWriter = new IndexWriter(LuceneUtil.getDirectory(),LuceneUtil.getAnalyzer(),LuceneUtil.getMaxFieldLength()); indexWriter.addDocument(document);//核心 indexWriter.close(); } @Test public void addAll() throws Exception{ IndexWriter indexWriter = new IndexWriter(LuceneUtil.getDirectory(),LuceneUtil.getAnalyzer(),LuceneUtil.getMaxFieldLength()); Article article1 = new Article(1,"培訓","火星是一家java培訓機構"); Document document1 = LuceneUtil.javabean2document(article1); indexWriter.addDocument(document1); Article article2 = new Article(2,"培訓","水星是一家net培訓機構"); Document document2 = LuceneUtil.javabean2document(article2); indexWriter.addDocument(document2); Article article3 = new Article(3,"培訓","金星是一家php培訓機構"); Document document3 = LuceneUtil.javabean2document(article3); indexWriter.addDocument(document3); Article article4 = new Article(4,"培訓","土星是一家ios培訓機構"); Document document4 = LuceneUtil.javabean2document(article4); indexWriter.addDocument(document4); Article article5 = new Article(5,"培訓","木星是一家ui培訓機構"); Document document5 = LuceneUtil.javabean2document(article5); indexWriter.addDocument(document5); Article article6 = new Article(6,"培訓","天王星是一家c++培訓機構"); Document document6 = LuceneUtil.javabean2document(article6); indexWriter.addDocument(document6); Article article7 = new Article(7,"培訓","海王星是一家SEO培訓機構"); Document document7 = LuceneUtil.javabean2document(article7); indexWriter.addDocument(document7); indexWriter.close(); } @Test public void update() throws Exception{ Article newArticle = new Article(1,"培訓","冥王星是一家JAVA培訓機構"); Document document = LuceneUtil.javabean2document(newArticle); IndexWriter indexWriter = new IndexWriter(LuceneUtil.getDirectory(),LuceneUtil.getAnalyzer(),LuceneUtil.getMaxFieldLength()); //更新id=7的document對象 /* * 參數一:term表示需要更新的document對象,id表示document對象中的id屬性,7表示該id屬性的值 * 參數二:新的document對象 */ indexWriter.updateDocument(new Term("id","1"),document);//核心 indexWriter.close(); } @Test public void delete() throws Exception{ IndexWriter indexWriter = new IndexWriter(LuceneUtil.getDirectory(),LuceneUtil.getAnalyzer(),LuceneUtil.getMaxFieldLength()); indexWriter.deleteDocuments(new Term("id","2"));//核心 indexWriter.close(); } @Test public void deleteAll() throws Exception{ IndexWriter indexWriter = new IndexWriter(LuceneUtil.getDirectory(),LuceneUtil.getAnalyzer(),LuceneUtil.getMaxFieldLength()); indexWriter.deleteAll();//核心 indexWriter.close(); } @Test public void findAllByKeyWords() throws Exception{ String keywords = "培"; List<Article> articleList = new ArrayList<Article>(); QueryParser queryParser = new QueryParser(LuceneUtil.getVersion(),"content",LuceneUtil.getAnalyzer()); Query query = queryParser.parse(keywords); IndexSearcher indexSearcher = new IndexSearcher(LuceneUtil.getDirectory()); TopDocs topDocs = indexSearcher.search(query,100);//核心 for(int i=0;i<topDocs.scoreDocs.length;i++){ ScoreDoc scoreDoc = topDocs.scoreDocs[i]; int no = scoreDoc.doc; Document document = indexSearcher.doc(no); Article article = (Article)LuceneUtil.document2javabean(document,Article.class); articleList.add(article); } for(Article a : articleList){ System.out.println( a ); } }}
新聞熱點
疑難解答