01 一步一步学lucene 索引

简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://dba10g.blog.51cto.com/764602/1359564

内容

  • 创建某个目录的索引

  • 查询索引

1.基于文件目录,创建索引

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
/**
* 创建目录下的文件索引
*
* @param indexedDir
*            :待创建索引目录
* @param indexTargetDir
*            : 索引目标路径
*/
public  void  newIndex(String indexedDir, String indexTargetDir) {
File fileDir =  new  File(indexedDir);
Collection<File> files = FileUtils.listFiles(fileDir,  null true );
IndexWriterConfig config =  new  IndexWriterConfig(Version.LUCENE_35,
new  StandardAnalyzer(Version.LUCENE_35));
File indexFile =  new  File(indexTargetDir);
IndexWriter iw =  null ;
try  {
Directory idxDirc = FSDirectory.open(indexFile);
iw =  new  IndexWriter(idxDirc, config);
for  (File file : files) {
if  (file.isFile()) {
Document doc =  new  Document();
Reader reader =  new  FileReader(file);
String type = FilenameUtils.getExtension(file.getName());
//文件名称 域
doc.add( new  Field( "filename" , file.getAbsolutePath(),
Field.Store.YES, Field.Index.NOT_ANALYZED));
//文件内容  域
doc.add( new  Field( "content" , reader));
//文件类型
doc.add( new  Field( "type" , type, Field.Store.YES,
Field.Index.NOT_ANALYZED_NO_NORMS));
//文件日期
doc.add( new  NumericField( "date" , Field.Store.YES,  true )
.setLongValue(file.lastModified()));
//文件大小
doc.add( new  NumericField( "size" , Field.Store.YES,  false )
.setIntValue( new  Long(file.length()).intValue()));
iw.addDocument(doc);
}
}
catch  (CorruptIndexException e) {
e.printStackTrace();
catch  (LockObtainFailedException e) {
e.printStackTrace();
catch  (FileNotFoundException e) {
e.printStackTrace();
catch  (IOException e) {
e.printStackTrace();
finally  {
try  {
iw.close();
catch  (CorruptIndexException e) {
e.printStackTrace();
catch  (IOException e) {
e.printStackTrace();
}
}
}

创建索引

1
2
3
4
String indexedDir =  "F:\\lucene\\data" ;
String indexTargetDir =  "F:\\lucene\\index" ;
Index01 util =  new  Index01();
util.newIndex(indexedDir, indexTargetDir);

执行成功后,F:/lucene/index目录下会有fdt,fdx,fnm,nrm,prx等等文件。

2.根据文件类型进行查询

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
/**
* 查询文件类型
*
* @param indexPath: 索引路径
* @param type:文件类型
* @param size:条目
*/
public  void  queryByFileType(String indexPath, String type,  int  size) {
Directory dir =  null ;
IndexReader reader =  null ;
IndexSearcher searcher =  null ;
try  {
dir = FSDirectory.open( new  File(indexPath));
reader = IndexReader.open(dir);
searcher =  new  IndexSearcher(reader);
Query query =  new  TermQuery( new  Term( "type" , type));
TopDocs tops = searcher.search(query, size);
ScoreDoc[] docs = tops.scoreDocs;
for  (ScoreDoc sd : docs) {
Document doc = searcher.doc(sd.doc);
System.out.print( "filename:"  + doc.get( "filename" )+ "\t" );
System.out.print( "size:"  + doc.get( "size" ));
System.out.println();
}
catch  (Exception e) {
e.printStackTrace();
finally  {
try  {
reader.close();
catch  (IOException e) {
e.printStackTrace();
}
}
}

1
2
3
4
System.out.println( "查询类型为\"java\"文件列表" );
util.queryByFileType(indexTargetDir,  "java" 100 );
System.out.println( "查询类型为\"xml\"文件列表" );
util.queryByFileType(indexTargetDir,  "xml" 100 );

执行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
查询类型为 "java" 文件列表
filename:F:\lucene\data\java\com\service\BaseService.java   size:353
filename:F:\lucene\data\java\com\validate\Person.java   size:471
filename:F:\lucene\data\java\com\validate\PersonValidator.java  size:682
filename:F:\lucene\data\java\com\spring\aop\Person.java size:101
filename:F:\lucene\data\java\com\spring\aop\Man.java    size:151
filename:F:\lucene\data\java\com\spring\aop\PersonProxy.java    size:613
filename:F:\lucene\data\java\org\wh\tech\spring\aop\BusinessService.java    size:173
filename:F:\lucene\data\java\org\wh\tech\spring\aop\BusinessServiceImpl.java    size:375
filename:F:\lucene\data\java\org\wh\tech\spring\aop\XMLExampleAspect.java   size:1654
查询类型为 "xml" 文件列表
filename:F:\lucene\data\resources\service.xml   size:2429
filename:F:\lucene\data\resources\service.xml   size:2429
filename:F:\lucene\data\resources\service.xml   size:2429

此时,发现查询的xml文件,有重复。这是由于lucene创建索引默认是基于递增的创建方式。

1
2
org.apache.lucene.index.IndexWriterConfig.OpenMode
public  static  enum  OpenMode { CREATE, APPEND, CREATE_OR_APPEND }

可以通过以下语句,删除索引,再创建。

1,先删后增

1
org.apache.lucene.index.IndexWriter.deleteAll()

2.设置创建索引的OPEN_MODE

 

1
2
3
IndexWriterConfig config =  new  IndexWriterConfig(Version.LUCENE_35,
new  StandardAnalyzer(Version.LUCENE_35));
config.setOpenMode(OpenMode.CREATE);

 

 

本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/1359564

目录
相关文章
|
6月前
|
存储 自然语言处理 索引
05Lucene索引库的添加
05Lucene索引库的添加
16 0
|
6月前
|
SQL 数据库 索引
08Lucene索引库查询 - 介绍
08Lucene索引库查询 - 介绍
25 0
|
6月前
|
索引
06Lucene索引库的删除
06Lucene索引库的删除
16 0
|
SQL 自然语言处理 算法
Lucene就是这么简单(三)
Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的架构,提供了完整的创建索引和查询索引,以及部分文本分析的引擎,Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎,Lucene在全文检索领域是一个经典的祖先,现在很多检索引擎都是在其基础上创建的,思想是相通的。
118 0
Lucene就是这么简单(三)
|
SQL 数据采集 自然语言处理
Lucene就是这么简单(一)
Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的架构,提供了完整的创建索引和查询索引,以及部分文本分析的引擎,Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎,Lucene在全文检索领域是一个经典的祖先,现在很多检索引擎都是在其基础上创建的,思想是相通的。
133 0
Lucene就是这么简单(一)
|
存储 自然语言处理 数据库
5分钟了解lucene全文索引
本文通俗地介绍了Lucene全文检索的内容及工作原理,以及索引的结构,旨在让以前未了解过Lucene的读者在能在短时间内对Lucene有简单认知,未介绍具体代码,读完本文可知道Lucene是什么,有哪些具体应用,我们一直说的索引是什么。
|
SQL 自然语言处理 算法
Lucene就是这么简单
什么是Lucene?? Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的架构,提供了完整的创建索引和查询索引,以及部分文本分析的引擎,Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎,Lucene在全文检索领域是一个经典的祖先,现在很多检索引擎都是在其基础上创建的,思想是相通的。
1233 0