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, nulltrue);

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

时间: 2024-11-05 12:19:35

01 一步一步学lucene 索引的相关文章

一步一步学lucene——(第二步:示例篇)

在上面的篇幅中我们已经了解到了lucene,及lucene到底是做什么的,什么情况下才能够使用lucene,下面我们就结合一个例子来详细说明一下lucene的API,看看lucene是如何工作的. lucene的下载 其实这个很简单了,直接到baidu或者google上搜索一下,一般情况下第一个就是我们要的链接.下边给出lucene下载的链接: http://lucene.apache.org/ 图:lucene下载主页面 配置环境 我们下面要做很多的测试,会建立很多的测试工程,如果一个一个手动

【DG】[三思笔记]一步一步学DataGuard

[DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)......................Oracle Data Guard.而对于我而言,我一定要亲切的叫它:DG(注:主要是因为打着方便). 不少未实际接触过dg的初学者可能会下意识以为dg是一个备份恢复的工具.我要说的是,这种形容不完全错,dg拥有备份的功能,某些情况下它甚至可以与primary数据库

一步一步学ROP之linux_x64篇

一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等).上次我们主要讨论了linux_x86的ROP攻击:<一步一步学ROP之linux_x86篇>,在这次的教程中我们会带来上一篇的补充以及linux_x64方面的ROP利用方法,欢迎大家继续学习. 另外文中涉及代码可在我的github下载:https://githu

一步一步学EJB3.0(三):悟透会话Bean(下)

三.无状态会话Bean实例 在上一篇文章里,其实我们已经应用到了无状态会话Bean,那好,下面我们详细的来分析下上一篇文 章里给出的示例程序. 没有阅读过的朋友请点击这里阅读:<<一步一步学EJB 3.0(二):初探企业 EJB模块开发>> . 首先我们来看看接口的定义: 1 /** 2 * 远程接口 3 * @author Beniao 4 */ 5 @Remote 6 public interface HelloRemote { 7 void sayHello(String s

一步一步学NUnit(2)

前一章我们简单介绍了NUnit的入门示例<一步一步学NUnit(1)>,让大家对NUnit有个简单的认识. NUnit的使用是非常简单的,但是它在项目中使用时,有许多最佳实践.这章我们把上一章没有讲到的 NUnit的一些配置和特性介绍一下. 要想熟练地使用NUnit还是要在实践中使用和体会,单纯地学习知识点是没有用的. 好,不再废话了.继续上一章的内容. 在Visual Studio 2008 中打开上一章的示例,Calculator类有4个最简单的方法:加.减.乘.除. Calculator

一步一步学ROP之linux_x86篇

一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等).虽然现在大家都在用64位的操作系统,但是想要扎实的学好ROP还是得从基础的x86系统开始,但看官请不要着急,在随后的教程中我们还会带来linux_x64以及android (arm)方面的ROP利用方法,欢迎大家继续学习. 小编备注:文中涉及代

一步一步学Silverlight :使用样式封装控件观感

概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON.Web Service.WCF以及Sockets的支持等一系列新的特性.<一步一步学Silverlight 2系列>文章带您快速进入Silverlight 2开发. 本文为系列文章第八篇,主要介绍在Silverlight中使用Style元素封装控件观感 Silv

一步一步学Silverlight :在Silverlight中如何用JavaScript调用.NET代码

概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON.Web Service.WCF以及Sockets的支持等一系列新的特性.<一步一步学Silverlight 2系列>文章将从Silverlight 2基础知识.数据与通信.自定义控件.动画.图形图像等几个方面带您快速进入Silverlight 2开发. Silv

一步一步学Silverlight :基本控件

概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON.Web Service.WCF以及Sockets的支持等一系列新的特性.<一步一步学Silverlight 2系列>文章带您快速进入Silverlight 2开发. 本文为系列文章第二篇学习几个基本的控件. 在Silverlight 2中,提供了大量的控件,包括