lucene 简单实用

 1 package com.kite.luncene.helloworld;  2 
 3 import java.io.File;  4 import java.util.ArrayList;  5 import java.util.List;  6 
 7 import org.apache.lucene.analysis.Analyzer;  8 import org.apache.lucene.analysis.standard.StandardAnalyzer;  9 import org.apache.lucene.document.Document;  10 import org.apache.lucene.document.Field;  11 import org.apache.lucene.document.Field.Index;  12 import org.apache.lucene.document.Field.Store;  13 import org.apache.lucene.index.IndexWriter;  14 import org.apache.lucene.index.IndexWriter.MaxFieldLength;  15 import org.apache.lucene.queryParser.QueryParser;  16 import org.apache.lucene.search.IndexSearcher;  17 import org.apache.lucene.search.Query;  18 import org.apache.lucene.search.ScoreDoc;  19 import org.apache.lucene.search.TopDocs;  20 import org.apache.lucene.store.Directory;  21 import org.apache.lucene.store.FSDirectory;  22 import org.apache.lucene.util.Version;  23 import org.junit.Test;  24 
 25 import com.kite.bean.Article;  26 
 27 public class HelloWorld  28 {  29  @Test  30     public void testCreate() throws Exception  31  {  32         /**
 33  * 一、建立一个article对象,而且把信息存放进去  34  * 二、调用indexWriter的API把数据存放在索引库中  35  * 三、关闭indexWriter  36          */
 37         //建立一个article对象,而且把信息存放进去
 38         Article article = new Article();  39         article.setId(1L);  40         article.setTitle("java goodnice");  41         article .setContent("多年来就是这么吊");  42         
 43         //二、调用indexWriter的API把数据存放在索引库中
 44          /**
 45  * 建立一个IndexWriter  46  * 参数三个  47  * 一、索引库 指向索引库的位置  48  * 二、分词器  49             */
 50             //建立索引库
 51             Directory directory = FSDirectory.open(new File("./indexDir"));  52             //建立分词器
 53             Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);  54         IndexWriter indexWriter = new IndexWriter(directory, analyzer, MaxFieldLength.LIMITED);  55         
 56         //把一个对象转换成document
 57         Document document = new Document();  58         Field idField = new Field("id", article.getId().toString(), Store.YES, Index.NOT_ANALYZED);  59         Field titleField = new Field("title", article.getTitle(), Store.YES, Index.ANALYZED);  60         Field contentField = new Field("content", article.getContent(), Store.YES, Index.ANALYZED);  61  document.add(idField);  62  document.add(titleField);  63  document.add(contentField);  64  indexWriter.addDocument(document);  65         
 66         //三、关闭indexWriter
 67  indexWriter.close();  68  }  69     
 70  @Test  71     public  void testSearchIndex() throws Exception  72  {  73         /**
 74  * 1.建立一个 indexSerach对象  75  * 2.调用search方法进行检索  76  * 3.输出内容  77          */
 78         
 79         // 1.建立一个 indexSerach对象  80         //--索引库
 81         Directory directory = FSDirectory.open(new File("./indexDir"));  82         IndexSearcher searcher = new IndexSearcher(directory);  83         //2..调用search方法进行检索  84         //--
 85         Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);  86         QueryParser queryParser = new QueryParser(Version.LUCENE_30, "id", analyzer);  87         //设置搜索的关键字
 88         Query query = queryParser.parse("1");  89         TopDocs topDocs = searcher.search(query, 10);  90         //得到根据关键字查询出来的总的记录数
 91         int count = topDocs.totalHits;  92         List<Article> articles = new ArrayList<Article>();  93         //得到数组
 94         ScoreDoc[] scoreDocs = topDocs.scoreDocs;  95         for(ScoreDoc scoreDoc : scoreDocs)  96  {  97             //关键字得分
 98             float score = scoreDoc.score;  99             //索引的下标
100             int index = scoreDoc.doc; 101             //根据索引得到document对象
102             Document document = searcher.doc(index); 103             //把document转化成article
104             Article article = new Article(); 105             article.setId(Long.parseLong(document.get("id"))); 106             article.setTitle(document.get("title")); 107             article.setContent(document.get("content")); 108  articles.add(article); 109  } 110         for(Article article : articles) 111  { 112  System.out.println(article.getId()); 113  System.out.println(article.getTitle()); 114  System.out.println(article.getContent()); 115  } 116  } 117 }


两个工具类
package com.kite.luncene.utils; import java.io.File; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class LunceneUtils { //索引库
    public static Directory directory; //分词器
    public static Analyzer analyzer; static { try { directory = FSDirectory.open(new File("./indexDor")); analyzer = new StandardAnalyzer(Version.LUCENE_30); } catch (Exception e) { e.printStackTrace(); } } }

package com.kite.luncene.utils; 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 com.kite.bean.Article; public class DocumentUtils { /** * 经过 article得到document * @param article * @return
     */
    public static Document articleToDocument(Article article) { Document document = new Document(); Field idField = new Field("id", article.getId().toString(), Store.YES, Index.NOT_ANALYZED); Field titleField = new Field("title", article.getTitle(), Store.YES, Index.ANALYZED); Field contentField = new Field("content", article.getContent(), Store.YES, Index.ANALYZED); document.add(idField); document.add(titleField); document.add(contentField); return document; } /** * 经过document 得到article对象 * @param document * @return
     */
    public static Article documentToArticle(Document document) { Article article = new Article(); article.setId(Long.parseLong(document.get("id"))); article.setTitle((document.get("title"))); article.setContent(document.get("content")); return article; } }


实用工具类实现简单的增删改查功能
package com.kite.luncene.index; 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.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.util.Version; import org.junit.Test; import com.kite.bean.Article; import com.kite.luncene.utils.DocumentUtils; import com.kite.luncene.utils.LunceneUtils; public class ArticleIndex { @Test public void testCreateIndex() throws Exception { IndexWriter indexWriter = new IndexWriter(LunceneUtils.directory, LunceneUtils.analyzer, MaxFieldLength.LIMITED); Article article = new Article(); article.setId(1L); article.setTitle("luncenes是一个好难写的东西"); article.setContent("百度,谷歌是很好的搜索引擎"); //经过工具类转换成document
        Document document = DocumentUtils.articleToDocument(article); indexWriter.addDocument(document); indexWriter.close(); } @Test public void testSearchIndex() throws Exception { IndexSearcher indexSearcher = new IndexSearcher(LunceneUtils.directory); /** * Version.LUCENE_30 版本 * "title" 根据那个字段 * LunceneUtils.analyzer 分词器 */ QueryParser queryParser = new QueryParser(Version.LUCENE_30, "title", LunceneUtils.analyzer); //luncene 关键字
        Query query = queryParser.parse("luncene"); TopDocs topDocs = indexSearcher.search(query, 2); //得到根据关键字查询到的全部的记录数
        int count = topDocs.totalHits; ScoreDoc[] scoreDocs = topDocs.scoreDocs; List<Article> articles = new ArrayList<Article>(); for(ScoreDoc scoreDoc : scoreDocs) { //scoreDoc.score 得到关键字得分
            float score = scoreDoc.score; //scoreDoc.doc 得到索引的下标
            int index = scoreDoc.doc; //经过索引的下标进行查询
            Document document = indexSearcher.doc(index); Article article = DocumentUtils.documentToArticle(document); articles.add(article); } //遍历输出
        for(Article article : articles) { System.out.println(article.getId().toString()); System.err.println(article.getTitle()); System.out.println(article.getContent()); } } /** * 修改是先删除 而后进行添加 * @throws Exception */ @Test public void testDeleteIndex() throws Exception { IndexWriter indexWriter = new IndexWriter(LunceneUtils.directory, LunceneUtils.analyzer, MaxFieldLength.LIMITED); //indexWriter.deleteAll();--删除全部
        /* * term 关键字对象 * title 字段名 * luncenes 关键字的内容 */ Term term = new Term("title", "luncenes"); //根据关键字进行删除 会在文件夹中增长一个.del结尾的文件
 indexWriter.deleteDocuments(term); indexWriter.close(); } @Test public void testUpdateIndex() throws Exception { IndexWriter indexWriter = new IndexWriter(LunceneUtils.directory, LunceneUtils.analyzer, MaxFieldLength.LIMITED); Term term = new Term("title","luncenes"); Article article = new Article(); article.setId(1L); article.setTitle("luncene是一个好难写的东西,少个s不解释"); article.setContent("百度,谷歌是很好的搜索引擎"); /* * term 根据关键字进行修改 * doc 修改后的内容 */ indexWriter.updateDocument(term, DocumentUtils.articleToDocument(article)); indexWriter.close(); } }
相关文章
相关标签/搜索