Lucene 3.6.2入门(1) 第一个程序:Hello Word

package com.jadyer.lucene;  

import java.io.File;
import java.io.FileReader;
import java.io.IOException;  

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.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;  

/**
 * 【Lucene3.6.2入门系列】第01节_HelloWord
 * @see 这里只需用到一个lucene-core-3.6.2.jar
 * @see Lucene官网:http://lucene.apache.org
 * @see Lucene下载:http://archive.apache.org/dist/lucene/java/
 * @see Lucene文档:http://wiki.apache.org/lucene-java/
 * @see ---------------------------------------------------------------------------------------

----------------------
 * @see 1)对于全文搜索工具,都是由索引、分词、搜索三部分组成
 * @see 2)被存储和被索引,是两个独立的概念
 * @see ---------------------------------------------------------------------------------------

----------------------
 * @see 域的存储选项
 * @see Field.Store.YES--会把该域中的内容存储到文件中,方便进行文本的还原
 * @see Field.Store.NO---表示该域中的内容不存储到文件中,但允许被索引,且内容无法完全还原(doc.get

("##"))
 * @see ---------------------------------------------------------------------------------------

----------------------
 * @see 域的索引选项
 * @see Field.Index.ANALYZED----------------进行分词和索引,适用于标题、内容等
 * @see Field.Index.NOT_ANALYZED------------进行索引但不分词(如身份证号、姓名、ID等),适用于精确

搜索
 * @see Field.Index.ANALYZED_NOT_NORMS------进行分词但是不存储norms信息,这个norms中包括了创建索

引的时间和权值等信息
 * @see Field.Index.NOT_ANALYZED_NOT_NORMS--即不进行分词也不存储norms信息
 * @see Field.Index.NO----------------------不进行索引
 * @see norms:当数据被搜索出来后,便涉及到排序的问题,而排序是有一些评分规则的,于是NORMS中就存储了

这些排序的信息
 * @see ---------------------------------------------------------------------------------------

----------------------
 * @see 域选项最佳实践
 * @see Field.Store   Field.Index              域值
 * @see       YES     NOT_ANALYZED_NOT_NORMS   标识符(主键、文件名),电话号码,身份证号,姓名,日

期
 * @see       YES     ANALYZED                 文档标题和摘要
 * @see        NO     ANALYZED                 文档正文
 * @see        NO     NOT_ANALYZED             隐藏关键字
 * @see       YES     NO                       文档类型,数据库主键(不进行索引)
 * @see ---------------------------------------------------------------------------------------

----------------------
 * @create Jun 29, 2012 4:20:19 PM
 * @author 玄玉<http://blog.csdn.net/jadyer>
 */
public class HelloWord {
    private static final String PATH_OF_FILE = "myExample/01_file/";   //待索引文件的目录
    private static final String PATH_OF_INDEX = "myExample/01_index/"; //存放索引文件的目录  

    /**
     * 创建索引
     * @see -----------------------------------------------------------------------------------

----------------------
     * @see 1、创建Directory-----------------指定索引被保存的位置
     * @see 2、创建IndexWriter---------------通过IndexWriter写索引
     * @see 3、创建Document对象---------------我们索引的有可能是一段文本or数据库中的一张表
     * @see 4、为Document添加Field------------相当于Document的标题、大小、内容、路径等等,二者类

似于数据库表中每条记录和字段的关系
     * @see 5、通过IndexWriter添加文档到索引中
     * @see 6、关闭IndexWriter----------------用完IndexWriter之后,必须关闭之
     * @see -----------------------------------------------------------------------------------

----------------------
     * @see _0.fdt和_0.fdx文件--保存域中所存储的数据(Field.Store.YES条件下的)
     * @see _0.fnm文件----------保存域选项的数据(即new Field(name, value)中的name)
     * @see _0.frq文件----------记录相同的文件(或查询的关键字)出现的次数,它是用来做评分和排序的
     * @see _0.nrm文件----------存储一些评分信息
     * @see _0.prx文件----------记录偏移量
     * @see _0.tii和_0.tis文件--存储索引里面的所有内容信息
     * @see segments_1文件------它是段文件,Lucene首先会到段文件中查找相应的索引信息
     * @see -----------------------------------------------------------------------------------

----------------------
     */
    public void createIndex(){
        Directory directory = null;
        IndexWriter writer = null;
        Document doc = null;
        try{
            //FSDirectory会根据当前的运行环境打开一个合理的基于File的Directory(若在内存中创建索

引则new RAMDirectory())
            //这里是在硬盘上"D:/OS_Folder/Desktop/luceneDemo/index01/"文件夹中创建索引
            directory = FSDirectory.open(new File(PATH_OF_INDEX));
            //由于Lucene2.9之后,其索引的格式就不会再兼容Lucene的所有版本了,所以在创建索引前,要指

定其所匹配的Lucene版本号
            //这里通过IndexWriterConfig()构造方法的Version.LUCENE_36参数值指明索引所匹配的版本号

,并使用了Lucene的标准分词器
            writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36, new 

StandardAnalyzer(Version.LUCENE_36)));
            for(File file : new File(PATH_OF_FILE).listFiles()){
                doc = new Document();
                //把内容添加到索引域中,即为该文档存储信息,供将来搜索时使用(下面的写法,其默认为

Field.Store.NO和Field.Index.ANALYZED)
                //如果我们想把content的内容也存储到硬盘上,那就需要先把file转换成字符串,然后按

照"fileName"的存储方式加到Field中
                //我们可以用commons-io-2.3.jar提供的FileUtils.readFileToString(file),这是很方便

的工具包,有了它几乎都不用手写任何的IO方法了
                //doc.add(new Field("content", FileUtils.readFileToString(file), 

Field.Store.YES, Field.Index.ANALYZED));
                doc.add(new Field("content", new FileReader(file)));
                //Field.Store.YES-----------这里是将文件的全名存储到硬盘中
                //Field.Index.NOT_ANALYZED--这里是不对文件名进行分词
                doc.add(new Field("fileName", file.getName(), Field.Store.YES, 

Field.Index.NOT_ANALYZED));
                doc.add(new Field("filePath", file.getAbsolutePath(), Field.Store.YES, 

Field.Index.NOT_ANALYZED));
                //通过IndexWriter添加文档到索引中
                writer.addDocument(doc);
            }
        }catch(Exception e){
            System.out.println("创建索引的过程中遇到异常,堆栈轨迹如下");
            e.printStackTrace();
        }finally{
            if(null != writer){
                try {
                    writer.close(); //IndexWriter在用完之后一定要关闭
                } catch (IOException ce) {
                    System.out.println("关闭IndexWriter时遇到异常,堆栈轨迹如下");
                    ce.printStackTrace();
                }
            }
        }
    }  

    /**
     * 搜索文件
     * @see 1、创建Directory
     * @see 2、创建IndexReader
     * @see 3、根据IndexReader创建IndexSearcher
     * @see 4、创建搜索的Query
     * @see 5、根据searcher搜索并返回TopDocs
     * @see 6、根据TopDocs获取ScoreDoc对象
     * @see 7、根据searcher和ScoreDoc对象获取具体的Document对象
     * @see 8、根据Document对象获取需要的值
     * @see 9、关闭IndexReader
     */
    public void searchFile(){
        IndexReader reader = null;
        try{
            reader = IndexReader.open(FSDirectory.open(new File(PATH_OF_INDEX)));
            IndexSearcher searcher = new IndexSearcher(reader);
            //创建基于Parser搜索的Query,创建时需指定其"搜索的版本,默认搜索的域,分词器"....这里的

域指的是创建索引时Field的名字
            QueryParser parser = new QueryParser(Version.LUCENE_36, "content", new 

StandardAnalyzer(Version.LUCENE_36));
            Query query = parser.parse("java");       //指定==>搜索域为content(即上一行代码指

定的"content")中包含"java"的文档
            TopDocs tds = searcher.search(query, 10); //第二个参数指定搜索后显示的条数,若查到5条

则显示为5条,查到15条则只显示10条
            ScoreDoc[] sds = tds.scoreDocs;           //TopDocs中存放的并不是我们的文档,而是文档

的ScoreDoc对象
            for(ScoreDoc sd : sds){                   //ScoreDoc对象相当于每个文档的ID号,我们就

可以通过ScoreDoc来遍历文档
                Document doc = searcher.doc(sd.doc);  //sd.doc得到的是文档的序号
                System.out.println(doc.get("fileName") + "[" + doc.get("filePath") + "]"); //输

出该文档所存储的信息
            }
        }catch(Exception e){
            System.out.println("搜索文件的过程中遇到异常,堆栈轨迹如下");
            e.printStackTrace();
        }finally{
            if(null != reader){
                try {
                    reader.close();
                } catch (IOException e) {
                    System.out.println("关闭IndexReader时遇到异常,堆栈轨迹如下");
                    e.printStackTrace();
                }
            }
        }
    }
}

测试时,要在myExample/01_file/文件夹中准备几个包含内容的文件(比如txt格式的)

然 后先执行createIndex()方法,再执行searchFile()方法,最后观看控制台输出即可

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索lucene
, 文件
, apache
, 索引
, 分词器
, import
, ik analyzer分词器
, field
, lucene net3 0 3
, indexreader
, see
@see
lucene 3.6.1、lucene 3.6 jar包下载、lucene 3.6、lucene 3.6.2 下载、lucene3.6 教程,以便于您获取更多的相关知识。

时间: 2024-12-02 05:50:18

Lucene 3.6.2入门(1) 第一个程序:Hello Word的相关文章

vb入门教程-第一章HELLO WORLD

教程|入门教程 第一章 HELLO WORLD! 没学过编程的人常常会问,编程难不难,这个问题很难回答.难,的确很难,要编一个好的程序尤其是这样,并且有些程序还要用到一些其他专业的知识,比如说一个图形处理程序,就要对图像的格式有所了解,甚至一些美术知识:但编程也很容易,就拿VB来说,编一个自娱自乐的小工具还是一件相当惬意的事情呢,当然它没法完全代替人工,譬如说完成你的家庭作业.向学校发射导弹-- 作为第四代计算机语言,VB的特点是显而易见的.因为是"可视的"所以我们不妨先看看VB的界面

Java入门教程系列 – 第一个程序 “hello, world”

原文Java入门教程系列 – 第一个程序 "hello, world" Posted on 2012 年 5 月 25 日 by Johnny "Hello, World"程序指的是指在计算机屏幕上输出"Hello, World!"(意为"世界,你好!")这行字符串的计算机程序.一般来说,这是每一种计算机编程语言中最基本.最简单的程序,亦通常是初学者所编写的第 一个程序.它还可以用来确定该语言的编译器.程序开发环境,以及运行环

《C++入门经典(第6版)》——第1章 编写第一个程序1.1 使用C++

第1章 编写第一个程序 C++入门经典(第6版) 本章介绍如下内容: C++是如何发明的以及发明它的原因: 如何寻找C++编译器: 如何创建并编译第一个程序: 如何链接并运行程序. 1.1 使用C++ 1979年,美国贝尔实验室的一位丹麦计算机科学家开始着手改进C编程语言.Bjarne Stroustrop在其个人网站上解释说,他希望有一种可以高效而优雅地编写程序的语言. 这也是很多人的愿望. Stroustrop将其作品取名为C++,几十年来,它一直占据着世界顶级编程语言的宝座.多年来,很多编

Visual C# 2010入门经典》一1.4 编写第一个程序

1.4 编写第一个程序 Visual C# 2010入门经典 至此,您应该对C#语言及其语法足够熟悉,能够编写第一个程序了.如果还没有安装Visual Studio 2010,现在就安装.鉴于这是您创建的第一个程序,因此将继承传统,创建一个在屏幕上显示"Hello, World"的简单程序. 1.4.1 新建项目 要新建项目,可单击起始页中的"新建项目"命令或工具栏中的"新建项目"按钮,也可使用菜单,图1.6说明了这些命令和菜单所处的位置. 这将

springBoot入门&gt;&gt;第一章&gt;&gt;springBoot第一个程序

前置条件  1.jdk安装完成  2.maven配置成功  3.myeclipse的maven插件配置成功 作者本人环境配置  1.mac Sierra 10.12.4   2.myeclipse2015  3.java版本:jdk 1.8.0_111  4.maven版本:Apache Maven 3.5.0  5.时间:2017-04-17 操作过程  1.创建项目          1.1 选择maven项目                           1.2创建第二步(不用修改)

《C++入门经典(第6版)》——1.3 创建您的第一个程序

1.3 创建您的第一个程序 介绍完程序的创建过程后,该创建您的第一个程序并尝试使用编译器了. 运行您用于创建程序的文本编辑器并新建一个文件.您将创建的第一个程序会在屏幕上显示文本. 在编辑器中输入程序清单1.1所示的文本,但不要包含左边的行号和它后面的冒号.这些行号旨在方便引用代码. 输入时,务必正确地输入标点,如第5行的字符::和<<. 输入完毕后,将文件保存为Motto.cpp. 程序清单1.1 Motto.cpp的完整代码 1: #include <iostream> 2:

Word入门动画教程1:新建Word文档

我们为各位不熟悉Word的读者准备了这个入门级动画教程,希望带领您了解Word.用好Word. 从今天开始我们会陆续为大家发布,敬请关注! 第一讲:新建Word文档 启动Word 2003应用程序后,Word自动创建一个名称为"文档1"的空白文档.如果要创建新的文档,可以使用下面三种方法: 方法一:按Ctrl+N快捷键 方法二:单击"常用"工具栏的"新建空白文档"按钮 方法三:执行"文件"→"新建-",启动

《“笨办法”学Python(第3版)》——习题1 第一个程序

习题1 第一个程序 你应该在习题0上花了不少的时间,学会了如何安装文本编辑器,运行文本编辑器,以及如何运行终端.如果你还没有完成这些练习,请不要继续往下进行了,否则你不会觉得很好过的.写在习题开头警告你不要跳过前面内容的警示本书中仅此一次,切记切记. 将下面的内容写到一个文件中,取名为ex1.py.这种命名方式很重要,Python文件最好以.py结尾. ex1.py print "Hello World!" print "Hello Again" print &qu

第一代程序员聚会的背后故事

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 金山软件20年高峰论坛嘉宾:王永民.王江民.王志东.求伯君.李儒雄.吴晓军.周志农.雷军.鲍岳桥.简晶.陈宗周. 1.最强阵容.终于有时间来回忆一些事,某些成为历史的事在忘记之前需要用记录下来.11月12日,作为金山20周年庆典的前奏,"中国软件20年,知识英雄再聚首"高峰论坛在北京举行.这个活动由求伯君.王志东共同发起,