Lucene4入门
来源:互联网 发布:淘宝上几十元的麦克风 编辑:程序博客网 时间:2024/06/05 18:45
Lucene4.4入门(1)
Lucene主要分为三大块:
1、创建索引
2、分词
3、读取并查询索引
我们今天的入门主要讲创建索引和读取查询索引,使用的Lucene的版本是4.4。
第一步:创建一个java工程添加lucene-core-4.4.0.jar、lucene-analyzers-common-4.4.0.jar和lucene-queryparser-4.4.0.jar三个jar文件
一个核心jar文件、一个标准分词文件和一个查询的jar文件。完成后的工程图如下:
第二步:在java工程中创建两个文件夹用来分别放原文件和索引文件(content、index)在content文件夹 中放一些txt文件,完成后的工程图:
第三步:创建一个java类命名为ReaderAndWriterIndex.java并创建两个方法,createindex()用来创建索引,searcher()用来查询,
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package
com.cqn;
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.document.FieldType;
import
org.apache.lucene.document.StringField;
import
org.apache.lucene.document.TextField;
import
org.apache.lucene.index.DirectoryReader;
import
org.apache.lucene.index.FieldInfo.IndexOptions;
import
org.apache.lucene.index.IndexReader;
import
org.apache.lucene.index.IndexWriter;
import
org.apache.lucene.index.IndexWriterConfig;
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
ReaderAndWriterIndex {
public
static
void
createindex(){
IndexWriter writer =
null
;
try
{
//创建Directory对象有多种方式,使用FSDirectory.open()创建它会选择最优的方式获得
//Directory对象,Directory实现类包括SimpleFSDirectory和RAMDirectory两个类
//其中RAMDirectory是在内存中创建索引对象
//1、创建Directory对象来保存索引,index为刚才创建的index目录
Directory dir = FSDirectory.open(
new
File(
"index"
));
//2、创建IndexWriter对象需要IndexWriterConfig和Analyzer对象,这里使用标准分词器
IndexWriterConfig config =
new
IndexWriterConfig(Version.LUCENE_47,
new
StandardAnalyzer(Version.LUCENE_47));
writer =
new
IndexWriter(dir, config);
//3、创建Document对象
Document doc =
null
;
File file =
new
File(
"content"
);
//创建一个索引存储分词的FieldType
//在这里FieldType对象只是为了说明,下面并没有使用。
FieldType index_store_tokeniz =
new
FieldType();
index_store_tokeniz.setIndexed(
true
);
index_store_tokeniz.setIndexOptions(IndexOptions.DOCS_ONLY);
index_store_tokeniz.setStored(
true
);
index_store_tokeniz.setTokenized(
true
);
index_store_tokeniz.freeze();
for
(File f : file.listFiles()){
//4、根据索引内容创建Field对象并添加到Document中
doc =
new
Document();
//为Documnet对象添加需要索引或保存的合适的Field对象
//TextField是一个索引分词可以存储的Field实现
doc.add(
new
TextField(
"filename"
, f.getName(), Field.Store.YES));
//StringField是一个索引可以存储但不分词的Field实现
doc.add(
new
StringField(
"filepath"
,f.getPath(),Field.Store.YES));
//TextField是一个索引分词可以存储的Field实现
//使用filename+Reader的构造是不存储的
doc.add(
new
TextField(
"content"
,
new
FileReader(f)));
//6、把Document对象添加到IndexWriter对象中
writer.addDocument(doc);
}
}
catch
(IOException e) {
e.printStackTrace();
}
finally
{
try
{
if
(writer !=
null
){
//6、关闭IndexWriter对象
writer.close();
}
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
public
static
void
searcher(){
try
{
//1、创建Directory
Directory dir = FSDirectory.open(
new
File(
"index"
));
//2、创建IndexReader
IndexReader reader = DirectoryReader.open(dir);
//3、根据IndexReader创建IndexSearcher
IndexSearcher searcher =
new
IndexSearcher(reader);
//4、创建QueryParser
QueryParser parser =
new
QueryParser(Version.LUCENE_47,
"content"
,
new
StandardAnalyzer(Version.LUCENE_47));
//5、根据QueryParser创建Query,并传递需要查询的词
Query query = parser.parse(
"Lucene"
);
//6、根据query使用IndexSearcher创建TopDocs
TopDocs tds = searcher.search(query,
10
);
//7、通过TopDocs获得ScoreDoc对象
ScoreDoc[] sds = tds.scoreDocs;
for
(ScoreDoc sd : sds){
//8、通过IndexSearcher和ScoreDoc.doc获得Document对象
Document d = searcher.doc(sd.doc);
//9、关键Document对象获得值
System.out.println(d.get(
"filename"
) +
"==="
+ d.get(
"filepath"
));
}
//10、关闭IndexReader
reader.close();
}
catch
(IOException e) {
e.printStackTrace();
}
catch
(ParseException e) {
e.printStackTrace();
}
}
}
第四步:为工程添加JUnit并编写测试类测试上面的两个方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package
com.cqn;
import
org.junit.Test;
public
class
IndexReaderMethodTest {
/**
* 测试创建索引方法
* */
@Test
public
void
testIndex(){
ReaderAndWriterIndex.createindex();
}
/**
* 测试查询索引方法
* */
@Test
public
void
testReader(){
ReaderAndWriterIndex.searcher();
}
}
首先执行indexTest()测试方法,运行完成后刷新java工程会在index目录中创建一些索引文件:
然后在执行查询方法会在控制台打印出包含Lucene词的文件,输出如图:
出处:http://my.oschina.net/MrMichael/blog/220684
0 0
- Lucene4入门
- lucene4.0入门实例
- Lucene4.3入门
- lucene4.2.1 入门
- Lucene4.3入门
- lucene4.4入门实践
- lucene4.0入门实例
- lucene4.10.2入门
- lucene4.10.3入门
- Lucene4.3入门
- Lucene4.0入门实例
- lucene4.0入门实例
- lucene4
- Lucene4 入门(2)–Field类及辅助类说明
- Lucene4 TokenStream
- what changes in lucene4
- Lucene4.0 Demo部署
- lucene4.0的配置
- 应用apache+tomcat的方式,是否可以支持3000人同时在线访问
- UML建模之时序图(Sequence Diagram)
- new和malloc的区别和联系
- 设计与咖啡:我在卖咖啡中学到的产品设计
- myeclipse jsp editor打开jsp的中文乱码解决方案
- Lucene4入门
- NYOJ 115 城市平乱
- 关于HTTP
- hdu-5206(判断空间正方形)
- JeffMolofee(NeHe)的OPENGL教程-第一课[2]-InitGL
- 三种方式实现自定义圆形页面加载中效果的进度条
- 安装TinyOS2.1.2(在Ubuntu14上)
- Java进阶(二)文件读操作
- android 进程优先级