• lucene


    lucene 版本与jdk版本匹配:

    昆明IT培训的老师知道Lucene,最新版是Lucene6.2.1,匹配的jdk版本是1.8正式版。

    这里用jdk7最后一版,所以用Lucene5.3.3。引用的jar包有: lucene-core-5.5.5.jar、lucene-queryparser-5.5.5.jar、lucene-analyzers-smartcn-5.5.5.jar、lucene-analyzers-common-5.5.5.jar、commons-io-2.5.jar

    一: 创建索引: 索引可以保存在内存和硬盘上,本例中把索引文件放到硬盘上。步骤: 1、指定保存索引的目录;2、创建 IndexWrier 对象 ;3、创建Document对象,相当于数据库表; 4、为Document 添加Field (Field 相当于表的字段);5; 通过IndexWriter 添加文档到索引目录中。 即把表信息写入到指定的目录中。代码如下:

        public void index() {
            IndexWriter writer = null;
            try
            {
                //1、创建Directory , 即索引文件在硬盘上保存的目录
                Path path = Paths.get("E:/myexe/luceneTest01/index01");
                Directory directory = FSDirectory.open(path);
                //2、创建 IndexWriter , 通过 IndexWriter 把 Document 写入到硬盘中。
                IndexWriterConfig iwc = new IndexWriterConfig(new StandardAnalyzer());
                writer =  new IndexWriter(directory, iwc);
                //在写入前需要先删除以前的索引文件。否则会重复。
                writer.deleteAll();
                //3、创建Document 对象,类似数据库表。
                Document doc = null;
                //4、读取指定目录下所有的源文件,把这些文件的 内容,文件名,文件路径作为Document表的 Field。
                File f= new File("E:/myexe/luceneTest01/example/");
                for(File file:f.listFiles()) {
                   doc =  new Document();
                   doc.add(new TextField("content",new FileReader(file)));
                   doc.add(new TextField("filename",file.getName(),Field.Store.YES));
                   doc.add(new TextField("path", file.getAbsolutePath(),Field.Store.YES));
                   // 5、通过IndexWriter 把Document 写入到索引文件中,索引文件保存在指定的 Directory 目录。
                   writer.addDocument(doc);
                }
            }
            catch (CorruptIndexException e) {
                e.printStackTrace();
            }
            catch (LockObtainFailedException e) {
                e.printStackTrace();
            }
            catch(IOException e)
            {
                e.printStackTrace();
            } finally {
                try{
                    if (writer != null) {
                        //关闭IndexWriter
                        writer.close();
                    }
                }
                catch (CorruptIndexException e) {
                    e.printStackTrace();
                }
                catch(IOException e)
                {
                        e.printStackTrace();
                }
            }
        }
    Field.Store.YES 设置为YES 表示把这个域中的内容完全存储到索引文件中,方便进行文本的还原。 为NO 表示把域的内容不存储到文件中,但可以被索引。

    二: 搜索

        public void searcher()  {
            try {
                //1、创建 Directory , 指定搜索的 索引目录
                Path path = Paths.get("E:/myexe/luceneTest01/index01");
                Directory directory = FSDirectory.open(path);
                //2、创建IndexReader, IndexReader读取上面的 Directory
                IndexReader reader = DirectoryReader.open(directory);
                //3、根据IndexReader 创建IndexSearcher 
                IndexSearcher searcher = new IndexSearcher(reader);
                //4、创建搜索的Query,即相当于sql语句
                //指定所有域是 content,即在创建索引时保存的 content 域
                QueryParser parser = new QueryParser("content", new StandardAnalyzer());
                //搜索域 content 中包含 package 的文档
                Query query = parser.parse("package");
                //5、根据IndexSearcher 搜索,并返回 TopDocs 
                //第一个参数是搜索的条件,第二个参数是返回10条结果
                TopDocs tds = searcher.search(query, 10);
                //6、搜索的内容保存在 TopDocs 对象的 ScoreDoc对象 数组中。
                ScoreDoc[] sds = tds.scoreDocs;
                for(ScoreDoc sd:sds) {
                    //7、ScoreDoc 数组中元素的 doc 属性就是 搜索的 Document 对象
                    Document d = searcher.doc(sd.doc);
                    //8、获取 Document 的文件名、文件路径、文件内容
                    System.out.println(d.get("filename") + "  [" + d.get("path") + "]  " + d.get("content"));
                    System.out.println(d.get("content"));
                }
                //9、关闭reader
                reader.close();
            } 
            catch  (CorruptIndexException e) {
                e.printStackTrace();
            }
            catch  (IOException e) {
                e.printStackTrace();
            }
            catch  (ParseException e) {
                e.printStackTrace();
            }
            
        }

    输出 在E:myexeluceneTest01example 目录下的所有文件中包含 package 单词的内容。因为 content 在创建索引时,没有保存在索引文件中,所以 content 域是 null (因为文件内容 content 一般比较大,在创建索引是 

    doc.add(new TextField("content",new FileReader(file))); 没有把文件内容保存在 索引中) :

    PagerAppoint.java [E:myexeluceneTest01examplePagerAppoint.java] null
    null
    App.txt [E:myexeluceneTest01exampleApp.txt] null
    null

  • 相关阅读:
    gethostbyname() 用域名或主机名获取IP地址
    recv, recvfrom, recvmsg 从套接口接收一个消息
    献给初学者:谈谈如何学习Linux操作系统
    Linux 文件处理 之扫描目录 DIR
    Python 使用sys模块
    struct dirent和DIR结构体
    职场人必读的文字只花10分钟影响你一辈子!
    信号量与线程互斥锁的区别
    send/sendto/sendmsg函数解析
    互联网常见Open API文档资源
  • 原文地址:https://www.cnblogs.com/z360519549/p/9267179.html
Copyright © 2020-2023  润新知