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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕期吃了烂水果怎么办 邮快递水果坏了怎么办 快递寄水果坏了怎么办 闲鱼买家拒收水果怎么办 洗澡桶里有很多老鼠屎怎么办? 塑料和金属断了怎么办 孕妇吃了沙拉酱怎么办 孕妇淀粉吃多了怎么办 怀孕初期吃了杏怎么办 如果睡觉吃梨了怎么办 怀孕6个月有点贫血怎么办 怀孕八个多月有点贫血怎么办 生完小孩身体虚怎么办 孩子咳嗽厉害怎么办吃什么药 新生儿三天不拉大便怎么办 胃吃的变大了怎么办 小孩长高长的慢怎么办 小孩长高长得慢怎么办 小孩吃东西不吸收营养怎么办 婴儿长得太快怎么办 2个月婴儿长太快怎么办 孩子脚长得太快怎么办 4个月宝宝缺钙怎么办 2个月宝宝不长肉怎么办 小孩子长得不高怎么办 宝宝误吃蜂蜜了怎么办 有人拿着吃完的东西退货怎么办 婴儿个子长的慢怎么办 儿童长得太快怎么办 宝宝个子长太快怎么办 孩子九个月奶水不够怎么办 小孩起热痱子痒怎么办 媳妇生完小孩奶水出不来怎么办 生完孩子下奶疼怎么办 生完小孩没奶水怎么办 孩子半个月奶水越来越少怎么办 半个月后奶水越来越少怎么办 坐月子半个月奶水越来越少怎么办 孩子七个月奶水越来越少怎么办 生完孩子奶水越来越少怎么办 生完孩子回奶了怎么办