Lucene系列:(3)LuceneUtils之CRUD

來源:互聯網
上載者:User

標籤:lucene


第二版


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;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 static <T> void add(T t) throws Exception{Document document = javabean2document(t);IndexWriter indexWriter = new IndexWriter(getDirectory(), getAnalyzer(), getMaxFieldLength());indexWriter.addDocument(document);indexWriter.close();}public static <T> void addAll(List<T> 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 <T> 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 <T> 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 <T> List<T> search(String field,String keyword,int topN) throws Exception{List<T> list = new ArrayList<T>();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<topDocs.scoreDocs.length;i++){ScoreDoc scoreDoc = topDocs.scoreDocs[i];int docIndex = scoreDoc.doc;System.out.println("文檔索引號" + docIndex + ",文檔得分:" + scoreDoc.score);Document document = indexSearcher.doc(docIndex);T entity = (T) document2javabean(document, Article.class);list.add(entity);}indexSearcher.close();return list;}public static <T> void printList(List<T> 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> T document2javabean(Document document,Class<T> 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);}}


ArticleDao2.java

package com.rk.lucene.crud;import java.util.ArrayList;import java.util.List;import org.junit.Test;import com.rk.lucene.entity.Article;import com.rk.lucene.utils.LuceneUtils;public class ArticleDao2 {@Testpublic void testAdd() throws Exception{List<Article> articleList = new ArrayList<Article>();articleList.add(new Article(1, "衛星地圖", "從衛星上鳥瞰地球,感受前所未有的視覺衝擊。"));articleList.add(new Article(2, "未來地球", "2025年的未來地球將面臨資源耗盡的難題"));articleList.add(new Article(3, "Google地球", "Google Earth(Google地球)是一款Google公司開發的虛擬地球儀軟體"));articleList.add(new Article(4, "十大科學發現", "2016年十大科學發現 發現另一個地球。"));articleList.add(new Article(5, "紀錄片BBC", "電視系列片"行星地球"(2006)的電影版本,拍攝了幾個動物家庭的遷徙路線。"));articleList.add(new Article(6, "神秘的地球", "神秘的地球 神秘的地球網站內容涉及宇宙奧秘、航空航天、考古發現"));articleList.add(new Article(7, "科學網", "俄專家確認去年5月探測神秘無線電訊號來自地球"));articleList.add(new Article(8, "地球公轉", "地球公轉就是地球按一定軌道圍繞太陽轉動"));articleList.add(new Article(9, "黑洞", "人類在宇宙中已經辨識出了許多黑洞,既有恒星級黑洞,也有超大品質黑洞。"));articleList.add(new Article(10, "白洞是如何形成的", "20世紀60年代中期蘇聯學者諾維柯夫和尼曼又各自提出了白洞理論"));LuceneUtils.addAll(articleList);}@Testpublic void testSearch() throws Exception{List<Article> list = LuceneUtils.search("content", "地球", 10);LuceneUtils.printList(list);}@Testpublic void testUpdate() throws Exception{Article article = new Article(3, "你好", "歡迎來到我的地球");LuceneUtils.update("id","3",article);}@Testpublic void testDelete() throws Exception{LuceneUtils.delete("id","3");}}







第一版


LuceneUtils.java

package com.rk.lucene.utils;import java.io.File;import java.io.IOException;import java.lang.reflect.Method;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.MaxFieldLength;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;public class LuceneUtils {private static Directory directory;private static Version version;private static Analyzer analyzer;private static MaxFieldLength maxFieldLength;static{try {directory = FSDirectory.open(new File("D:/rk/indexDB"));version = Version.LUCENE_30;analyzer = new StandardAnalyzer(version);maxFieldLength = MaxFieldLength.LIMITED;} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}//不讓外部new當前協助類的對象private LuceneUtils(){}//將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> T document2javabean(Document document,Class<T> 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);}}


ArticleDao.java

package com.rk.lucene.crud;import java.util.ArrayList;import java.util.List;import org.apache.lucene.document.Document;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.Term;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.junit.Test;import com.rk.lucene.entity.Article;import com.rk.lucene.utils.LuceneUtils;public class ArticleDao {public void add(Article article) throws Exception{Document document = LuceneUtils.javabean2document(article);IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());indexWriter.addDocument(document);indexWriter.close();}public void addAll(List<Article> articleList) throws Exception{IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());for(Article article : articleList){Document doc = LuceneUtils.javabean2document(article);indexWriter.addDocument(doc);}indexWriter.close();}public void update(Article article) throws Exception{Document document = LuceneUtils.javabean2document(article);IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());indexWriter.updateDocument(new Term("id",document.get("id")), document);indexWriter.close();}public void delete(String field,String txt) throws Exception{IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());indexWriter.deleteDocuments(new Term(field,txt));indexWriter.close();}public void deleteAll() throws Exception {IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());indexWriter.deleteAll();indexWriter.close();}public <T> List<T> search(String field,String keyword,int topN) throws Exception{List<T> list = new ArrayList<T>();QueryParser queryParser = new QueryParser(LuceneUtils.getVersion(), field, LuceneUtils.getAnalyzer());Query query = queryParser.parse(keyword);IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.getDirectory());TopDocs topDocs = indexSearcher.search(query, topN);for(int i=0;i<topDocs.scoreDocs.length;i++){ScoreDoc scoreDoc = topDocs.scoreDocs[i];System.out.println(scoreDoc.score);int docIndex = scoreDoc.doc;Document document = indexSearcher.doc(docIndex);T entity = (T) LuceneUtils.document2javabean(document, Article.class);list.add(entity);}indexSearcher.close();return list;}public <T> void print(List<T> list){if(list != null && list.size()>0){for(T t : list){System.out.println(t);}}}@Testpublic void testAdd() throws Exception{List<Article> articleList = new ArrayList<Article>();articleList.add(new Article(1, "衛星地圖", "從衛星上鳥瞰地球,感受前所未有的視覺衝擊。"));articleList.add(new Article(2, "未來地球", "2025年的未來地球將面臨資源耗盡的難題"));articleList.add(new Article(3, "Google地球", "Google Earth(Google地球)是一款Google公司開發的虛擬地球儀軟體"));articleList.add(new Article(4, "十大科學發現", "2016年十大科學發現 發現另一個地球。"));articleList.add(new Article(5, "紀錄片BBC", "電視系列片"行星地球"(2006)的電影版本,拍攝了幾個動物家庭的遷徙路線。"));articleList.add(new Article(6, "神秘的地球", "神秘的地球 神秘的地球網站內容涉及宇宙奧秘、航空航天、考古發現"));articleList.add(new Article(7, "科學網", "俄專家確認去年5月探測神秘無線電訊號來自地球"));articleList.add(new Article(8, "地球公轉", "地球公轉就是地球按一定軌道圍繞太陽轉動"));articleList.add(new Article(9, "黑洞", "人類在宇宙中已經辨識出了許多黑洞,既有恒星級黑洞,也有超大品質黑洞。"));articleList.add(new Article(10, "白洞是如何形成的", "20世紀60年代中期蘇聯學者諾維柯夫和尼曼又各自提出了白洞理論"));addAll(articleList);}@Testpublic void testSearch() throws Exception{List<Article> list = search("content", "地球", 10);print(list);}@Testpublic void testUpdate() throws Exception{Article article = new Article(3, "你好", "歡迎來到我的地球");update(article);}@Testpublic void testDelete() throws Exception{//delete("id", "1");delete("id","3");}}








Lucene系列:(3)LuceneUtils之CRUD

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.