第一步:下载并导入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

绝对秋香引领你走向潮流。

____________________________


lucene3.6.0 经典案例 入门教程的更多相关文章

  1. lucene3.6.1 经典案例 入门教程 (包含从文件中读取content)

    转载http://liqita.iteye.com/blog/1676664 第一步:下载lucene的核心包 lucene-core-3.6.1-javadoc.jar (3.5 MB) lucen ...

  2. 1.0 Android基础入门教程

    1.0 Android基础入门教程 分类 Android 基础入门教程 本教程于2015年7月开始撰写,耗时半年,总共148节,涵盖了Android基础入门的大部分知识,由于当时能力局限,虽已竭尽全力 ...

  3. .Net Core 2.0 EntityFrameworkCore CodeFirst入门教程

    最近难得有时间闲下来,研究了一下.net core 2.0,总的来说,目前除了一些第三方的库不支持外,基本上可以满足我们的项目需求了! 我们就以一个网站开发为例,搭建一个简单的三层架构,先熟悉一下.n ...

  4. Vue2.0 探索之路——vuex入门教程和思考

    Vuex是什么 首先对于vuex是什么,我先引用下官方的解释. Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可 ...

  5. ABP入门教程0 - 目录

    ABP入门教程 本教程主要讲解如何基于ABP实现CURD(增删改查)示例. 源码已分享:   GitHub   Gitee ABP入门教程0 - 目录 ABP入门教程1 - 开篇 ABP入门教程2 - ...

  6. ps入门教程:画笔工具、铅笔工具、渐变工具等的使用

    本节课程主要内容:学习画笔工具.铅笔工具.颜色替换工具.历史记录画笔工具.历史记录艺术画笔工具.渐变工具和油漆桶 工具的应用.------------------------------------- ...

  7. vuex入门教程和思考 [转] 里面有几个实例

    Vuex基础概念 vuex中涉及的概念主要有下面几点,下面做个简单的介绍和理解. Vuex 官方文档:https://vuex.vuejs.org/zh-cn/ 官网有介绍,也有个demo shopp ...

  8. 正则表达式入门教程&&经典Javascript正则表达式(share)

    前言 例子: ^.+@.+\\..+$ 这样的代码曾经多次把我自己给吓退过.可能很多人也是被这样的代码给吓跑的吧.继续阅读本文将让你也可以自由应用这样的代码. 正文 教程:正则表达式30分钟入门教程 ...

  9. 【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-上位机源码

    [CC2530入门教程-增强版]基础技能综合实训案例(基础版)-上位机源码 广东职业技术学院  欧浩源 一.需求分析 按照指定参数打开串口,与测控终端建立数据传输通道,并根据应用要求实现程序逻辑,具体 ...

随机推荐

  1. C++编程规范之17:避免使用“魔数”

    摘要: 程序设计并非魔术,所以不要故弄玄虚,要避免在代码中使用诸如42和3.1415926这样的文字常量.它们本身没有提供任何说明,并且因为增加了难于检测的重复而使维护更加复杂.可以用符号名称和表达式 ...

  2. Linux下Redis的安装、配置操作说明

    Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用.它提供了Pytho ...

  3. 获取布局 ActionBar

    LayoutInflater inflater = getLayoutInflater();View imageLayout = inflater.inflate(R.layout.preferenc ...

  4. Linux下的进程控制块——task_struct

    在Linux中具体实现PCB的是 task_struct数据结构,以下实现摘自github 我想说它真的很长很长...... ↓ struct task_struct { volatile long ...

  5. (五)《Java编程思想》——final关键字

    可能使用final的三种情况:数据.方法.类. 1.final数据 final 常量必须是基本类型数据,且在定义时须赋值: 一个既是static又是final的域只占据一段不能改变的存储空间,只有一份 ...

  6. avalon

    http://avalonjs.coding.me/ 有时间详细写

  7. 【转】char *str 和 char str[]的区别

    char str[] = "abcd";定义了一个局部字符数组,返回它的地址肯定是一个已经释放了的空间的地址. 此函数返回的是内部一个局部字符数组str的地址,且函数调用完毕后 此 ...

  8. poj1988 简单并查集

    B - 叠叠乐 Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:30000KB     64bit ...

  9. 左右推拽显示对比图 - jQyery封装 - 附源文件

    闲来无事,做了一个模块效果 左右拖拽显示对比图,是用jq封装的 利用鼠标距离左侧(0,0)坐标的横坐标位移来控制绝对定位的left值 再配合背景图fixed属性,来制作视觉差效果 代码如下 <! ...

  10. ecmascript 的一些发展新动向

    ========== ecmascript 的一些发展新动向 (e5a57b27 - initial commit) 更弱.更受限 严格模式禁止 arguments.callee - 可以 " ...