zoukankan      html  css  js  c++  java
  • lucene3.6.0 经典案例 入门教程

    第一步:下载并导入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 est1.txt正在被索引....欢迎来到绝对秋香的博客。 

    File C:source est2.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("____________________________
    ");
    		            }
    	            }
    	            reader.close();
    	            directory.close();
    	        }   
            } catch (ParseException e) {
            	e.printStackTrace();
            }
        }    
    }

    2. FileIndexReader
    找到:2 个结果!
    ____________________________
    C:source est1.txt
    欢迎来到绝对秋香的博客。
    ____________________________


    ____________________________
    C:source est2.txt
    绝对秋香引领你走向潮流。
    ____________________________



  • 相关阅读:
    html5实现全屏的api方法
    用html5(requestFullscreen) js实现点击一个按钮使浏览器全屏效果
    HTML5 中fullscreen 中的几个API和fullscreen欺骗
    杭州收集
    JS DOM -- 关于回车键盘事件执行事件
    AngularCSS 的引入: CSS On-Demand for AngularJS
    用Javascript获取页面元素的位置
    angularjs 可以加入html标签方法------ng-bind-html的用法总结(2)
    angularjs 可以加入html标签方法------ng-bind-html的用法总结(1)
    onkeypress、onkeydown、onkeyup
  • 原文地址:https://www.cnblogs.com/anyuan9/p/6171545.html
Copyright © 2011-2022 走看看