日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Lucene搜索引擎例子demo

發(fā)布時間:2025/3/15 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lucene搜索引擎例子demo 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一.導(dǎo)入相應(yīng)的jar包

KAnalyzer3.2.0Stable.jar lucene-analyzers-3.0.1.jar lucene-core-3.0.1.jar lucene-highlighter-3.0.1.jar lucene-memory-3.0.1.jar 二.寫一個完整的demo 1.創(chuàng)建一個實體 DROP TABLE IF EXISTS `article`; CREATE TABLE `article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(20) DEFAULT NULL, `content` varchar(5000) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; public class Article { private int id; private String title; private String content; get/set方法省略... }

2.創(chuàng)建一個提供公共方法的類:

//提供封裝分頁數(shù)據(jù)的類: @SuppressWarnings("rawtypes") public class QueryResult { private List list; private int count; get/set省略... }

3.//提供創(chuàng)建索引,目錄的類

public class LuceneUtils{ private static Directory directory;// 建立索引庫存儲目錄 private static Analyzer analyzer;// 創(chuàng)建分詞器 private static IndexWriter indexWriter; // 在程序啟動是初始化,建立索引 private static IndexSearcher indexSearcher;// 查詢 static { try { // 加載配置文件lucene.properties,該文件中是創(chuàng)建索引庫的路徑"path=D:\\IindexSearch Properties prop = new Properties(); InputStream inStream = LuceneUtils.class.getClassLoader().getResourceAsStream("lucene.properties"); //InputStream inStream = ClassLoader.getSystemResourceAsStream("lucene.properties"); prop.load(inStream); directory = FSDirectory.open(new File(prop.getProperty("path"))); analyzer = new StandardAnalyzer(Version.LUCENE_30); // 在程序啟動是初始化,建立索引 indexWriter = new IndexWriter(directory, analyzer, MaxFieldLength.LIMITED); //程序退出時關(guān)閉資源 Runtime.getRuntime().addShutdownHook(new Thread(){ public void run(){ try { indexWriter.close(); } catch (Exception e) { e.printStackTrace(); }? } }); } catch (Exception e) { e.printStackTrace(); } } public static Document objectToDocument(Object obj) { Article article = (Article) obj; // 將文檔轉(zhuǎn)為domcment Document doc = new Document(); String idstr = NumericUtils.intToPrefixCoded(article.getId()); doc.add(new Field("id", idstr, Store.YES, Index.NOT_ANALYZED)); doc.add(new Field("title", article.getTitle(), Store.YES, Index.ANALYZED)); doc.add(new Field("content", article.getContent(), Store.YES, Index.ANALYZED)); return doc; } public static Object documentToObject(Document doc) { Article article = new Article(); //將Document轉(zhuǎn)為Article //將字符串轉(zhuǎn)化為數(shù)字 int id = NumericUtils.prefixCodedToInt(doc.get("id")); article.setId(id); article.setTitle(doc.get("title")); article.setContent(doc.get("content")); return article; } public static IndexWriter getIndexWriter() { return indexWriter; } public static IndexSearcher getIndexSearch() { // 執(zhí)行查詢 try { indexSearcher = new IndexSearcher(directory); } catch (Exception e) { throw new RuntimeException(e); } return indexSearcher; } public static Directory getDirectory() { return directory; } public static Analyzer getAnalyzer() { return analyzer; } }

4.創(chuàng)建增刪改查方法

public class IndexDao { /** *? * @return * @throws Exception */ public void save(Article article) { try { // 將Aritcle轉(zhuǎn)為Documnet Document doc = LuceneUtils.objectToDocument(article); // 建立索引 IndexWriter indexWriter = LuceneUtils.getIndexWriter(); indexWriter.addDocument(doc); indexWriter.commit(); } catch (Exception e) { throw new RuntimeException(e); } } /** * 刪除索引庫 Term 表示制定列中包含的關(guān)鍵字 *? * @return * @throws Exception */ public void delete(Article article) { String idStr = NumericUtils.intToPrefixCoded(article.getId()); Term term = new Term("id", idStr); try { // 建立索引 IndexWriter indexWriter = LuceneUtils.getIndexWriter(); indexWriter.deleteDocuments(term);// 刪除指定Term總重的documnet數(shù)據(jù) indexWriter.commit(); } catch (Exception e) { throw new RuntimeException(e); } } /** * 修改索引庫 *? * @return * @throws Exception */ public void update(Article article) { // 創(chuàng)建Term String idStr = NumericUtils.intToPrefixCoded(article.getId()); Term term = new Term("id", idStr); // 準備document Document doc = LuceneUtils.objectToDocument(article); try { // 建立索引 IndexWriter indexWriter = LuceneUtils.getIndexWriter(); indexWriter.updateDocument(term, doc);// 刪除指定Term總重的documnet數(shù)據(jù) indexWriter.commit(); // 先刪除,在創(chuàng)建 // indexWriter.deleteDocuments(term); // indexWriter.addDocument(doc); } catch (Exception e) { throw new RuntimeException(e); } } /** * 查詢索引庫 *? * @return * @throws Exception */ public QueryResult query(String queryString, int first, int max) { IndexSearcher indexSearcher = null; try { // MultiFieldQueryParser:表示可以根據(jù)多個字段查詢 int totail = first + max; // 1.把字符串轉(zhuǎn)為Query對象 QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, new String[] { "id", "title", "content" }, LuceneUtils.getAnalyzer()); Query query = parser.parse(queryString); // 2.執(zhí)行查詢 indexSearcher = LuceneUtils.getIndexSearch(); // 指定排序條件 Sort sort = new Sort(new SortField("id", SortField.INT));// 按照id升序 TopDocs topDocs = indexSearcher.search(query, null, totail, sort);// 查詢并返回最多的前n條數(shù)據(jù) int count = topDocs.totalHits;// 總記錄數(shù) ScoreDoc[] scoreDoc = topDocs.scoreDocs;// 最多前n條結(jié)果數(shù)據(jù) // 生成高亮顯示器;設(shè)置前綴,后綴,摘要的大小 Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", "</font>"); Scorer scorer = new QueryScorer(query);// 查詢條件 Highlighter highlighter = new Highlighter(formatter, scorer); highlighter.setTextFragmenter(new SimpleFragmenter(100));// 設(shè)置摘要的大小 // 3.取出數(shù)據(jù) int endIndex = Math.min(totail, scoreDoc.length); List<Article> list = new ArrayList<Article>(); for (int i = 0; i < endIndex; i++) { // float score = scoreDoc[i].score;//平均得分 int docId = scoreDoc[i].doc; Document doc = indexSearcher.doc(docId); // 進行高亮操作,當沒有找到關(guān)鍵詞時,返回為null String text = highlighter.getBestFragment(LuceneUtils.getAnalyzer(), "title", doc.get("title")); if (text != null) { doc.getField("title").setValue(text); } // 將Document轉(zhuǎn)為Article Article article = (Article) LuceneUtils.documentToObject(doc); list.add(article); } QueryResult queryResult = new QueryResult(list, count); return queryResult; } catch (Exception e) { throw new RuntimeException(e); } }

5.測試dao方法:

@Test public void testSave() { // 創(chuàng)建文檔對象 Article article = new Article(); for (int i = 0; i < 20; i++) { article.setId(i); article.setTitle("Lucene搜索的方式"); article.setContent("全文檢索是計算機程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置。"); indexDao.save(article); } } @Test public void testDelete() { Article article = new Article(); article.setId(1); indexDao.delete(article); } @Test public void testUpdate() { // 創(chuàng)建文檔對象 Article article = new Article(); article.setId(1); article.setTitle("Lucene搜索的方式"); article.setContent("跟新索引庫測試是否正確"); indexDao.update(article); } @Test @SuppressWarnings("unchecked") public void testQuery() { String queryString = "Lucene"; QueryResult queryResult = indexDao.searchAndOrderBy(queryString, 0, 10); System.out.println("count---------->" + queryResult.getCount()); List<Article> list = (List<Article>)queryResult.getList(); for(Article article:list){ System.err.println("list--------->" + article.toString()); } }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Jansens520/p/7825764.html

總結(jié)

以上是生活随笔為你收集整理的Lucene搜索引擎例子demo的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。