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

目录
相关文章
|
存储 Web App开发 算法
c语言的简单入门
熟悉c语言(简单入门)
|
存储 缓存 Java
多线程与线程池总结
多线程与线程池总结
255 0
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
590 212
|
4天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
234 138
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
828 60
|
7天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1217 157