lucene3.6.0 经典案例 入门教程
来源:互联网 发布:手机淘宝团购在哪 编辑:程序博客网 时间:2024/05/01 19:17
第一步:下载并导入lucene的核心包(注意版本问题):
例如Lucene3.6版本:将lucene-core-3.6.0.jar拷贝到项目的libs 文件夹里。
例如Lucene4.6版本:将lucene-analyzers-common-4.6.0.jar、lucene-core-4.6.0.jar、lucene-queryparser-4.6.0.jar拷贝到项目的libs 文件夹里。
使用右击项目名--Build Path--Configure Build Path…--Add External JARs… 选择相关jar包,并保存。
第二步:建立文件夹:
在C盘下建立存放待索引的文件(C:\source),例如建立两个文件,名称为 test1.txt, test2.txt。
test1.txt文件内容为:欢迎来到绝对秋香的博客。
test2.txt文件内容为:绝对秋香引领你走向潮流。
在C盘下再建立存放索引的文件 (C:\index)
第三步,建立索引类 FileIndexWriter
/*建立索引类 TextFileIndexer**第一步:下载并导入lucene的核心包(注意版本问题):* 例如Lucene3.6版本:将lucene-core-3.6.0.jar拷贝到项目的libs 文件夹里。* 例如Lucene4.6版本:将lucene-analyzers-common-4.6.0.jar、lucene-core-4.6.0.jar、lucene-queryparser-4.6.0.jar拷贝到项目的libs 文件夹里。* 使用右击项目名--Build Path--Configure Build Path…--Add External JARs… 选择相关jar包,并保存。* *第二步:建立文件夹:* 在C盘下建立存放待索引的文件(C:\source),例如建立两个文件,名称为 test1.txt, test2.txt。* test1.txt文件内容为:欢迎来到绝对秋香的博客。* test2.txt文件内容为:绝对秋香引领你走向潮流。* 在C盘下再建立存放索引的文件 (C:\index)* *第三步,建立索引类 FileIndexWriter* *第四步,建立测试类FileIndexReader,输出测试结果* */import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;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.document.Field;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 FileIndexWriter {public static void main(String[] args) throws Exception { /* 指明要索引文件夹的位置,可以根据自己的需要进行设定。这里是C盘的source文件夹下 */ File fileDir = new File("C:\\source"); /* 这里放索引文件的位置 */ File indexDir = new File("C:\\index"); //1、创建Directory Directory dir = FSDirectory.open(indexDir); //索引文件的保存位置 //2、创建Analyzer //分析器,选择“标准分析器”,参数代表当前使用的Lucene版本(jar包),也有人写Version.LUCENE_CURRENT //StandardAnalyzer可以做如下功能: //1、对原有句子按照空格进行了分词 ; //2、所有的大写字母都可以能转换为小写的字母 ; //3、可以去掉一些没有用处的单词,例如"is","the","are"等单词,也删除了所有的标点。 Analyzer luceneAnalyzer=new StandardAnalyzer(Version.LUCENE_CURRENT); //3、创建IndexWriter //创建IndexWriter,索引的核心组件。在Lucene3.X版本后,在创建时需要用到IndexWriterConfig配置类对IndexWriter的配置。 //第一个参数是目前的版本,第二个参数是词法分析器Analyzer。 IndexWriterConfig iwc = new IndexWriterConfig( Version.LUCENE_CURRENT, luceneAnalyzer); //setOpenMode,设置存放索引的文件夹将以覆盖或者新建的方式建立,有下面几个选项: //APPEND:总是追加,可能会导致错误,索引还会重复,导致返回多次结果; //CREATE:清空重建(推荐); //CREATE_OR_APPEND【默认】:创建或追加。 iwc.setOpenMode(OpenMode.CREATE); IndexWriter indexWriter = new IndexWriter(dir,iwc); File[] textFiles = fileDir.listFiles(); long startTime = new Date().getTime(); //用于计算时间 //增加document(txt格式)到索引去 for (int i=0; i<textFiles.length; i++) { if (textFiles[i].isFile()&&textFiles[i].getName().endsWith(".txt")){ System.out.println("File "+textFiles[i].getCanonicalPath()+"正在被索引.."); String temp = FileReaderAll(textFiles[i].getCanonicalPath(), "GBK"); System.out.println(temp); //打印文件的内容 //申请一个document对象,代表一些域Field的集合。这个类似于数据库中的表。 //Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。 //4、创建Document对象 Document document = new Document(); //Field:字段,文档中的一个具体的域,如文档创建时间,作者,内容等。 //其组成部分包括type(域的类型),name(域的名称),fieldsData(域的值),boost(加强因子). //Field.Store.YES:存储域值,适用于显示搜索结果的字段 — 例如,文件路径和 URL。; //Field.Index.NO:使对应的域值不被搜索,适用于未搜索的字段 — 仅用于存储字段,比如文件路径。 //Field.Index.ANALYZED 用于字段索引和分析 — 例如,电子邮件消息正文和标题。 Field FieldPath = new Field("path", textFiles[i].getPath(), Field.Store.YES, Field.Index.NO); //路径 Field FieldBody = new Field("content", temp, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS); //内容 //5、为Document添加Field document.add(FieldPath); document.add(FieldBody); //6、通过IndexWriter添加文档到索引中 indexWriter.addDocument(document);//把doc对象加入到索引创建中。 } } indexWriter.close(); //关闭IndexWriter,提交创建内容。 //测试一下索引的时间 long endTime = new Date().getTime(); System.out.println("建立目录"+ fileDir.getPath()+" 下所有文档的索引,总共消耗 " +(endTime-startTime) + " 毫秒!" ); } public static String FileReaderAll(String FileName, String charset) throws IOException{ BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream(FileName), charset)); String line = new String(); String temp = new String(); while ((line = reader.readLine()) != null) { temp += line; } reader.close(); return temp; }}
运行结果:1.
FileIndexWriterFile C:\source\test1.txt正在被索引....欢迎来到绝对秋香的博客。
File C:\source\test2.txt正在被索引....绝对秋香引领你走向潮流。
建立目录C:\source 下所有文档的索引,总共消耗 465 毫秒!
第四步,建立测试类FileIndexReader,输出测试结果
package com.newlearner.lucene;/*建立测试类TestQuery,输出测试结果 * */import java.io.File;import java.io.IOException;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.index.IndexReader;import org.apache.lucene.queryparser.classic.ParseException;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.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.util.Version;public class FileIndexReader {public static void main(String[] args) throws IOException, ParseException{ //搜索的索引路径,lucene提供了两种索引存放的位置, //一种是磁盘(FSDirectory),一种是内存(RAMDirectory)。一般情况将索引放在磁盘上 String index = "C:\\index"; //1.创建Directory,根据IndexReader创建IndexSearcher(搜索器) Directory directory = FSDirectory.open(new File(index)); //2.创建Analyzer,设定分析器,必须与建立索引时采用的分析器相同 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT); //3.创建IndexReader IndexReader reader = IndexReader.open(directory); //打开存储位置 IndexSearcher searcher = new IndexSearcher(reader); String queryString = "绝对秋香"; //搜索的关键词 try { //4.创建搜索的Query,确定搜索的内容 //使用QueryParser完成解析搜索请求, //new QueryParser(version,Field字段, 分析器) ,Field字段为进行搜索的范围。 QueryParser qp = new QueryParser(Version.LUCENE_CURRENT,"content",analyzer); //Query对所传入的搜索关键词汇进行解释,并返回query对象。 //我们需要把查询String封装成Query才可以交给Searcher来搜索。 //lucene中支持模糊查询,语义查询,短语查询,组合查询等等, //如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。 Query query = qp.parse(queryString); //Query query = QueryParser.parser(“要查询的字串”) if (searcher != null) {//5.根据searcher搜索并且返回TopDocs //老版本中的Hits已经被弃用,代替它的是TopDocs, //这个对象封装了那些最符合搜索条件的结果的信息 TopDocs results = searcher.search(query,10); //返回搜索相似度最高的10条记录 //ScoreDoc是一个评分对象,因为lucene在搜索过程中,给每一个资源都评分, //然后按照分数高低来决定最符合的搜索条件的结果,这个对象同样存了这些结果的信息//6.根据TopDocs获取ScoreDoc对象 ScoreDoc[] hits = results.scoreDocs; //用于保存搜索结果 //打印搜索结果 if (hits.length > 0) { System.out.println("找到:" + hits.length + " 个结果!"); for (int i=0; i<hits.length; i++) {//7.根据search和ScordDoc对象获取具体的Document对象 Document hitDoc = searcher.doc(hits[i].doc); System.out.println("____________________________");//8.根据Document对象获取需要的值 System.out.println(hitDoc.get("path")); System.out.println(hitDoc.get("content")); System.out.println("____________________________\n"); } } reader.close(); directory.close(); } } catch (ParseException e) { e.printStackTrace(); } } }2. FileIndexReader
找到:2 个结果!
____________________________
C:\source\test1.txt
欢迎来到绝对秋香的博客。
____________________________
____________________________
C:\source\test2.txt
绝对秋香引领你走向潮流。
____________________________
0 0
- lucene3.6.0 经典案例 入门教程
- lucene3.6.1 经典案例 入门教程
- lucene3.6.1 经典案例 入门教程
- lucene3.6.1 经典案例 入门教程
- lucene3.6.1 经典案例 入门教程
- lucene3.6.1 经典案例 入门实例
- 【Lucene】Lucene3.6.1案例
- lucene3.6.0的分析器
- 经典案例
- lucene3.6.0的扩展搜索
- 4.Lucene3.案例介绍,创建索引,查询等操作验证
- saltstack入门教程精华案例
- Logstash 入门教程 -配置案例
- Flume入门教程-简单案例
- BPEL 经典实例入门教程
- ASP.NET入门教程(经典)
- ASP.NET入门教程(经典)
- bpel 经典实例入门教程
- docker添加多网卡
- 六一儿童节就要过去了,您是否因为工作忙绿而没办法陪孩子玩
- 支付宝网银支付接口
- 实现医生工作站的辅助检查功能的代码(七)
- ls -l各个位置详解
- lucene3.6.0 经典案例 入门教程
- 做了一个噩梦,梦见你离开,我从哭泣中醒来
- Spark1.3.1 Standalone 基于文件系统的 HA 部署
- zookeeper
- ASIHttpRequest
- 插入排序
- 3D数学基础 图形与游戏开发的学习 (四)[2D笛卡尔数学]
- Linux网络编程:原始套接字编程及实例分析(二)
- 无论如何选择