在lucene对文本进行处理的过程中,可以大致分为三大部分:
1、索引文件:提取文档内容并分析,生成索引
2、搜索内容:搜索索引内容,根据搜索关键字得出搜索结果
3、分析内容:对搜索词汇进行分析,生成Quey对象。
本文示例代码见我的github:https://github.com/irfen/lucene-example
本文使用的是JDK 1.7进行的开发测试,我这里测试发现JDK 1.6不好用,如果你也运行不成功,请尝试JDK 1.7版本。
首先是需要引入的包,我使用maven管理依赖。
需要用到的有
lucene-analyzers-common
lucene-analyzers-smartcn // 这是一个中文分词,用了一下不给力。
lucene-core
lucene-queryparser
lucene-queies
lucene-sandbox
如果你使用maven,可以直接粘贴我下面的代码,否则你也可以下载jar之后加入项目中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
org.apache.lucene lucene-analyzers-common 4.9.0 org.apache.lucene lucene-analyzers-smartcn 4.9.0 org.apache.lucene lucene-core 4.9.0 org.apache.lucene lucene-queryparser 4.9.0 |
1、建立索引
我这里使用了4个文本文件,分别是
a.txt:人民
b.txt:中华人民共和国
c.txt:人民共和国
d.txt:共和国
下面是建立索引的类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
package me.irfen.lucene.ch02; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.Reader; 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.StringField; import org.apache.lucene.document.TextField; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class LuceneIndex { // 索引器 private IndexWriter writer = null; public LuceneIndex(String indexStorePath) { try { // 索引文件的保存位置 Directory dir = FSDirectory.open(new File(indexStorePath)); // 分析器 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_9); // 配置类 IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_4_9, analyzer); iwc.setOpenMode(OpenMode.CREATE);// 创建模式 OpenMode.CREATE_OR_APPEND 添加模式 writer = new IndexWriter(dir, iwc); } catch (Exception e) { e.printStackTrace(); } } // 将要建立索引的文件构造成一个Document对象,并添加一个域"content" private Document getDocument(File f) throws Exception { Document doc = new Document(); FileInputStream is = new FileInputStream(f); Reader reader = new BufferedReader(new InputStreamReader(is)); // 字符串 StringField LongField TextField Field pathField = new StringField("path", f.getAbsolutePath(), Field.Store.YES); Field contenField = new TextField("contents", reader); // 添加字段 doc.add(contenField); doc.add(pathField); return doc; } public void writeToIndex(String indexFilePath) throws Exception { File folder = new File(indexFilePath); if (folder.isDirectory()) { String[] files = folder.list(); for (int i = 0; i < files.length; i++) { File file = new File(folder, files[i]); Document doc = getDocument(file); System.out.println("正在建立索引 : " + file + ""); writer.addDocument(doc); } } } public void close() throws Exception { writer.close(); } } |
下面是调用上面建立索引的测试方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public final static String INDEX_STORE_PATH = "f:/lucene/ch02/index"; // 索引的存放位置 public final static String INDEX_FILE_PATH = "f:/lucene/ch02/test"; // 索引的文件的存放路径 @Test public void testIndex() throws Exception { // 声明一个对象 LuceneIndex indexer = new LuceneIndex(INDEX_STORE_PATH); // 建立索引 long start = System.currentTimeMillis(); indexer.writeToIndex(INDEX_FILE_PATH); long end = System.currentTimeMillis(); System.out.println("建立索引用时" + (end - start) + "毫秒"); indexer.close(); } |
运行后控制台打印:
正在建立索引 : f:\lucene\ch02\test\a.txt
正在建立索引 : f:\lucene\ch02\test\b.txt
正在建立索引 : f:\lucene\ch02\test\c.txt
正在建立索引 : f:\lucene\ch02\test\d.txt
建立索引用时79毫秒
在我的f:\lucene\index文件夹下生成了一系列的文件。
2、搜索内容
搜索的类的主要代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
package me.irfen.lucene.ch02; import java.io.File; import java.util.Date; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryparser.classic.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.FSDirectory; import org.apache.lucene.util.Version; public class LuceneSearch { // 声明一个IndexSearcher对象 private IndexSearcher searcher = null; // 声明一个Query对象 private Query query = null; private String field = "contents"; public LuceneSearch(String indexStorePath) { try { IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(indexStorePath))); searcher = new IndexSearcher(reader); } catch (Exception e) { e.printStackTrace(); } } // 返回查询结果 public final TopDocs search(String keyword) { System.out.println("正在检索关键字 : " + keyword); try { Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_9); QueryParser parser = new QueryParser(Version.LUCENE_4_9, field, analyzer); // 将关键字包装成Query对象 query = parser.parse(keyword); Date start = new Date(); TopDocs results = searcher.search(query, 5 * 2); Date end = new Date(); System.out.println("检索完成,用时" + (end.getTime() - start.getTime()) + "毫秒"); return results; } catch (Exception e) { e.printStackTrace(); } return null; } // 打印结果 public void printResult(TopDocs results) { ScoreDoc[] h = results.scoreDocs; if (h.length == 0) { System.out.println("对不起,没有找到您要的结果。"); } else { for (int i = 0; i < h.length; i++) { try { Document doc = searcher.doc(h[i].doc); System.out.print("这是第" + i + "个检索到的结果,文件名为:"); System.out.println(doc.get("path")); } catch (Exception e) { e.printStackTrace(); } } } System.out.println("--------------------------"); } } |
下面是测试方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public final static String INDEX_STORE_PATH = "f:/lucene/ch02/index"; // 索引的存放位置 @Test public void testSearch() { LuceneSearch test = new LuceneSearch(INDEX_STORE_PATH); TopDocs h = null; h = test.search("中国"); test.printResult(h); h = test.search("人民"); test.printResult(h); h = test.search("共和国"); test.printResult(h); } |
执行结果如下:
正在检索关键字 : 中华
检索完成,用时29毫秒
这是第0个检索到的结果,文件名为:f:\lucene\ch02\test\b.txt
--------------------------
正在检索关键字 : 人民
检索完成,用时1毫秒
这是第0个检索到的结果,文件名为:f:\lucene\ch02\test\a.txt
这是第1个检索到的结果,文件名为:f:\lucene\ch02\test\c.txt
这是第2个检索到的结果,文件名为:f:\lucene\ch02\test\b.txt
--------------------------
正在检索关键字 : 共和国
检索完成,用时6毫秒
这是第0个检索到的结果,文件名为:f:\lucene\ch02\test\d.txt
这是第1个检索到的结果,文件名为:f:\lucene\ch02\test\c.txt
这是第2个检索到的结果,文件名为:f:\lucene\ch02\test\b.txt
--------------------------
查询完全正确。
Lucene的分析这个还有点远,我们以后细说。这就是整个过程的大致流程,当然还有许多可以改进的地方,我们以后也会一点一点的学习。
本文发表自赵伊凡BLOG
©原创文章,转载请注明来源: 赵伊凡's Blog
©本文链接地址: 2、Lucene4.9学习笔记——Lucene使用整体流程
为什么我执行出来的结果是:
正在检索关键字 : 中华
检索完成,用时51毫秒
对不起,没有找到您要的结果。
————————–
正在检索关键字 : 人民
检索完成,用时0毫秒
对不起,没有找到您要的结果。
————————–
正在检索关键字 : 共和国
检索完成,用时1毫秒
对不起,没有找到您要的结果。
————————–
真是奇怪了
很好的网站,赞一个,加油!
太厉害啦!值得我们学习
[cc拜年]
不错的网站,很喜欢,期待互访
这个是个高人啊
刚开一秒传奇http://bbs.caipiaodian.com.cn/
最新中变传奇网址http://bbs.caipiaodian.com.cn/
新开传奇最全最新http://bbs.caipiaodian.com.cn/
找私服网站http://bbs.caipiaodian.com.cn/
传奇变态私服http://bbs.caipiaodian.com.cn/
今日新开sfhttp://bbs.caipiaodian.com.cn/
新开超级变态传奇sfhttp://bbs.caipiaodian.com.cn/
新开中变传奇私服http://bbs.caipiaodian.com.cn/
新开传奇私服网http://bbs.caipiaodian.com.cn/
最新sfhttp://bbs.caipiaodian.com.cn/
传奇中变私服http://bbs.caipiaodian.com.cn/
今日新开传奇私服网http://bbs.caipiaodian.com.cn/
传奇私服变态http://bbs.caipiaodian.com.cn/
最新传奇sf网站http://bbs.caipiaodian.com.cn/
最新热血传奇私服http://bbs.caipiaodian.com.cn/
每日新开私服http://bbs.caipiaodian.com.cn/
传奇私服网站大全http://bbs.caipiaodian.com.cn/
新开变态传奇私服http://bbs.caipiaodian.com.cn/
变态传奇私服网站http://bbs.caipiaodian.com.cn/
今日新开轻变传奇sfhttp://bbs.caipiaodian.com.cn/
变态传奇世界私服http://bbs.caipiaodian.com.cn/
轻变传奇网站http://bbs.caipiaodian.com.cn/
最新传奇私服发布网站http://bbs.caipiaodian.com.cn/
最新中变传奇私服http://bbs.caipiaodian.com.cn/
变态私服传奇http://bbs.caipiaodian.com.cn/
新开复古传奇http://bbs.caipiaodian.com.cn/
新开sf传奇http://bbs.caipiaodian.com.cn/
新开轻变传奇私服http://bbs.caipiaodian.com.cn/
中变传世私服http://bbs.caipiaodian.com.cn/
新开传世sf网http://bbs.caipiaodian.com.cn/
新开传奇变态私服http://bbs.caipiaodian.com.cn/
变态传奇私服网http://bbs.caipiaodian.com.cn/
超变私服传奇http://bbs.caipiaodian.com.cn/
传奇私服sfhttp://bbs.caipiaodian.com.cn/
最新变态传奇http://bbs.caipiaodian.com.cn/
新开的传奇世界私服http://bbs.caipiaodian.com.cn/
新开传奇1.95http://bbs.caipiaodian.com.cn/
新开的传奇http://bbs.caipiaodian.com.cn/
最新开的传奇http://bbs.caipiaodian.com.cn/
最新sf传奇http://bbs.caipiaodian.com.cn/
传奇sf公布网http://bbs.caipiaodian.com.cn/
今日新开变态私服http://bbs.caipiaodian.com.cn/
传奇超变态私服http://bbs.caipiaodian.com.cn/
中变合击私服http://bbs.caipiaodian.com.cn/
中变传奇私发布网服http://bbs.caipiaodian.com.cn/
新开变态传奇sfhttp://bbs.caipiaodian.com.cn/
新开传奇2私服http://bbs.caipiaodian.com.cn/
超变态传奇sfhttp://bbs.caipiaodian.com.cn/
新开传奇sf发布http://bbs.caipiaodian.com.cn/
中变传奇sf发布网http://bbs.caipiaodian.com.cn/
新开变态私服http://bbs.caipiaodian.com.cn/
新开传奇轻变http://bbs.caipiaodian.com.cn/
今日新开变态传奇http://bbs.caipiaodian.com.cn/
新开轻变传奇sfhttp://bbs.caipiaodian.com.cn/
中变英雄合击http://bbs.caipiaodian.com.cn/
1.95皓月版本传奇http://bbs.caipiaodian.com.cn/
新开合击传奇网站http://bbs.caipiaodian.com.cn/
新开sfhttp://bbs.caipiaodian.com.cn/
盛大传奇私服http://bbs.caipiaodian.com.cn/
传奇sf发布站http://bbs.caipiaodian.com.cn/
最新传奇私服发布http://bbs.caipiaodian.com.cn/
传奇世界变态私服http://bbs.caipiaodian.com.cn/
最新开传奇合击私服http://bbs.caipiaodian.com.cn/
最新传奇sf发布网http://bbs.caipiaodian.com.cn/
变态热血传奇私服http://bbs.caipiaodian.com.cn/
变态合击传奇私服http://bbs.caipiaodian.com.cn/
网通中变传奇私服http://bbs.caipiaodian.com.cn/
传奇合击私服网http://bbs.caipiaodian.com.cn/
超变态私服传奇http://bbs.caipiaodian.com.cn/
最新版本传奇私服http://bbs.caipiaodian.com.cn/
私服开服表http://bbs.caipiaodian.com.cn/
合击传奇私服网http://bbs.caipiaodian.com.cn/
最热门传奇私服http://bbs.caipiaodian.com.cn/
超级变态传奇私服网http://bbs.caipiaodian.com.cn/
最新传奇sf发布网站http://bbs.caipiaodian.com.cn/
新开英雄合击私服http://bbs.caipiaodian.com.cn/
私服发布网http://bbs.caipiaodian.com.cn/
新开传奇sf网站http://bbs.caipiaodian.com.cn/
传奇合击网站http://bbs.caipiaodian.com.cn/
sf网站http://bbs.caipiaodian.com.cn/
私服网http://bbs.caipiaodian.com.cn/
新开传奇中变http://bbs.caipiaodian.com.cn/
新开http://bbs.caipiaodian.com.cn/
新开传奇sf发布网http://bbs.caipiaodian.com.cn/
中变私服http://bbs.caipiaodian.com.cn/
传奇新开http://bbs.caipiaodian.com.cn/
刚开一秒传奇sfhttp://bbs.caipiaodian.com.cn/
新开私服传奇http://bbs.caipiaodian.com.cn/
今日新开传奇发布网http://bbs.caipiaodian.com.cn/
今日新开私服http://bbs.caipiaodian.com.cn/
新开传奇发布http://bbs.caipiaodian.com.cn/
传世中变私服http://bbs.caipiaodian.com.cn/
最新传奇私服发布站http://bbs.caipiaodian.com.cn/
盛大私服http://bbs.caipiaodian.com.cn/
今日新开传世私服http://bbs.caipiaodian.com.cn/
今日新开变态传奇私服http://bbs.caipiaodian.com.cn/
新开超变态传奇私服http://bbs.caipiaodian.com.cn/
新开传奇私服刚开一秒http://bbs.caipiaodian.com.cn/
新开热血传奇私服网http://bbs.caipiaodian.com.cn/
超级变态合击http://bbs.caipiaodian.com.cn/
今日新开的传奇私服http://bbs.caipiaodian.com.cn/
变态传奇sf发布网http://bbs.caipiaodian.com.cn/
传奇私服新开一秒http://bbs.caipiaodian.com.cn/
传奇超变sfhttp://bbs.caipiaodian.com.cn/
热血传奇变态sfhttp://bbs.caipiaodian.com.cn/
新开英雄合击http://bbs.caipiaodian.com.cn/
最好的传奇私服发布网http://bbs.caipiaodian.com.cn/
热血传奇sf发布http://bbs.caipiaodian.com.cn/
轻变传奇sfhttp://bbs.caipiaodian.com.cn/
新开轻变传奇http://bbs.caipiaodian.com.cn/
超变态热血传奇私服http://bbs.caipiaodian.com.cn/
好私服传奇http://bbs.caipiaodian.com.cn/
zhongbianhttp://bbs.caipiaodian.com.cn/
传奇私服官方网站http://bbs.caipiaodian.com.cn/
刚开私服http://bbs.caipiaodian.com.cn/
传奇私服合击发布网http://bbs.caipiaodian.com.cn/
变态sf传奇http://bbs.caipiaodian.com.cn/
传奇变态私服发布网http://bbs.caipiaodian.com.cn/
新开一秒传奇私服http://bbs.caipiaodian.com.cn/
今日刚开一秒传奇http://bbs.caipiaodian.com.cn/
新开传奇网站中变http://bbs.caipiaodian.com.cn/
今日新开传奇私服http://bbs.caipiaodian.com.cn/
新开私服http://bbs.caipiaodian.com.cn/
今日新开传奇http://bbs.caipiaodian.com.cn/
最新开传奇私服http://bbs.caipiaodian.com.cn/
最新传奇私服网站http://bbs.caipiaodian.com.cn/
传奇合击sfhttp://bbs.caipiaodian.com.cn/
中变传奇sfhttp://bbs.caipiaodian.com.cn/
传奇新服http://bbs.caipiaodian.com.cn/
好sf传奇http://bbs.caipiaodian.com.cn/
新开传奇私服发布http://bbs.caipiaodian.com.cn/
传奇发布网站http://bbs.caipiaodian.com.cn/
私服发布网站http://bbs.caipiaodian.com.cn/
今日新开热血传奇sfhttp://bbs.caipiaodian.com.cn/
新开的传奇私服http://bbs.caipiaodian.com.cn/
变态合击传奇http://bbs.caipiaodian.com.cn/
sf发布网站http://bbs.caipiaodian.com.cn/
新开合击传奇http://bbs.caipiaodian.com.cn/
新开中变传奇http://bbs.caipiaodian.com.cn/
传奇sf发布网站http://bbs.caipiaodian.com.cn/
今日新开传奇世界http://bbs.caipiaodian.com.cn/
找sf传奇网站http://bbs.caipiaodian.com.cn/
新开超变传奇私服http://bbs.caipiaodian.com.cn/
传奇私发网http://bbs.caipiaodian.com.cn/
新开超变传奇http://bbs.caipiaodian.com.cn/
热血传奇sf网站http://bbs.caipiaodian.com.cn/
传奇私服宣传网http://bbs.caipiaodian.com.cn/
新传奇私服http://bbs.caipiaodian.com.cn/
英雄合击传奇发布网http://bbs.caipiaodian.com.cn/
轻变私服http://bbs.caipiaodian.com.cn/
最新开热血传奇私服http://bbs.caipiaodian.com.cn/
新开sf网站http://bbs.caipiaodian.com.cn/
新开合击传奇私服http://bbs.caipiaodian.com.cn/
sf传奇网站http://bbs.caipiaodian.com.cn/
传奇私发布网http://bbs.caipiaodian.com.cn/
传奇私服开区http://bbs.caipiaodian.com.cn/
变态传奇sf网站http://bbs.caipiaodian.com.cn/
传奇中变私服发布网http://bbs.caipiaodian.com.cn/
刚开的传奇私服http://bbs.caipiaodian.com.cn/
今日新开热血传奇http://bbs.caipiaodian.com.cn/
传奇私发布http://bbs.caipiaodian.com.cn/
传奇合击sf网站http://bbs.caipiaodian.com.cn/
新开传奇合击sfhttp://bbs.caipiaodian.com.cn/
传世中变 开服表http://bbs.caipiaodian.com.cn/
新开超变传奇sfhttp://bbs.caipiaodian.com.cn/
今天新开私服http://bbs.caipiaodian.com.cn/
中变传奇sf网站http://bbs.caipiaodian.com.cn/
私服网站大全http://bbs.caipiaodian.com.cn/
传奇私服 中变http://bbs.caipiaodian.com.cn/
合击传奇私服发布网http://bbs.caipiaodian.com.cn/
最新英雄合击http://bbs.caipiaodian.com.cn/
刚开一秒私服http://bbs.caipiaodian.com.cn/
传奇合击http://bbs.caipiaodian.com.cn/
最新传奇网站http://bbs.caipiaodian.com.cn/
新开传奇世界网站http://bbs.caipiaodian.com.cn/
私服传奇网站http://bbs.caipiaodian.com.cn/
最新传奇sfhttp://bbs.caipiaodian.com.cn/
今日新开传奇sfhttp://bbs.caipiaodian.com.cn/
找传奇sf网站http://bbs.caipiaodian.com.cn/
传奇中变http://bbs.caipiaodian.com.cn/
最新传奇私服网http://bbs.caipiaodian.com.cn/
新开传奇sf网http://bbs.caipiaodian.com.cn/
新开私服发布网http://bbs.caipiaodian.com.cn/
合击私服发布网http://bbs.caipiaodian.com.cn/