传智播客java学习---lucene初步

本文深入探讨了Lucene作为全文检索工具包的使用方法,包括环境准备、使用步骤、构造IndexWriter、创建索引、删除索引、更新索引及搜索等关键环节。详细解释了Directory、Analyzer、MaxFieldLength等核心概念,并介绍了如何利用高亮器突出显示匹配的关键字。

因为即将要学习lucene,所以我提前预习了lucene的相关知识,

 

1,lucene是众多搜索引擎中的一个,就像持久层除了Hibernate外也有很多其它框架

一样。Lucene是一个开发工具包,我们可以使用他为应用程序添加全文检索的功能。

 

2,目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系

统的搜索功能。 还有其他很多的网站的应用程序使用了Lucene。

 

3,Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转

化的文本的,Lucene 就能对你的文档进行索引和搜索。

 

 

使用步骤:

1,准备环境:添加jar包

   lucene-core-2.4.0.jar(核心);

   lucene-analyzers-2.4.0.jar(分词器);

   lucene-highlighter-2.4.0.jar(高亮器);

 

a) 建立索引.

b) 进行搜索.

 

 

2,构造IndexWriter。IndexWriter是Lucene用来创建索引的一个核心的类。使用

构造方法IndexWriter(Directory d, Analyzer a, MaxFieldLength mfl); 如果

索引不存在,就会被创建。

 

Directory,代表了 Lucene 的索引的存储的位置。这是一个抽象类,常用的有两

个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引位置。第

二个是 RAMDirectory,它表示一个存储在内存当中的索引位置。

 

Analyzer,在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分

工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对

不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给

IndexWriter 来建立索引。

 

MaxFieldLength,用于限制Field的大小。这个变量可以让用户有计划地对大文档

Field进行截取。假如取值为10000,就只索引每个Field的前10000个Term(关键

字)。也就是说每个Field中只有前10000个Term(关键字)建立索引,除此之外

的部分都不会被Lucene索引,当然也不能被搜索到。

 

 

3,创建索引,使用方法IndexWriter.addDocument(Document doc)。

 

Document,是用来描述Lucene文档结构的。任何需要进行索引的数据都必须转化

成Document对象。Document是索引和搜索的最基本单元,是一组Field的集合。

 

Field,组成Document的元素,用来描述一个文档的某个属性的,比如一封电子邮

件的标题和内容可以用两个Field对象分别描述。Field是由name和value组成的,

value只接受字符串(非字符串类型要先转换成字符串才行)。在构造Field时还

要指定Store和Index。

 

Field.Store,指定Field是否或怎样存储。

  Store.NO,不存储。

  Store.YES,存储。

  Store.COMPRESS,压缩后存储(数据量很大的时候可以使用,但要考虑效率)。

 

Field.Index,指定Field是否或怎么被索引。

  Index.NO,不索引(不索引就不能被搜索到)。

  Index.ANALYZED,(以前版本中为TOKENIZED),分词后索引。

  Index.NOT_ANALYZED,(以前版本中为UN_TOKENIZED),不分词,直接索引(把

                      整个Field值做为一个term)。

 

当完成了索引操作后,一定要调用IndexWriter.close()方法。

 

 

4,删除索引,IndexWriter.deleteDocuments(Term term);会删除索引文件里含

有指定Term的所有Document。

 

Term,是搜索的基本单位。代表某个Field中出现的某个关键字。 

 

 

5,更新索引,IndexWriter.updateDocument(Term term, Document doc)。实际上是

先删除再创建索引,就是说如果有多条符合条件的Document,更新后只有一条。

 

 

6,搜索,使用类IndexSearcher。

查询方法为IndexSearcher.search(Query, Filter, int);

Query,查询对象,把用户输入的查询字符串封装成Lucene能够识别的Query。

Filter,用来过虑搜索结果。

第三个参数(int类型),最多返回的Document的数量。

返回的是一个TopDocs类型的对象,调用TopDocs.scoreDocs得到查询结果。

 

 

 

*** 1,Directory,

有两个:

  a) FSDirectory,将索引放到磁盘中。

  b) RAMDirectory,将索引放到内存中。速度快,但是在jvm退出之后,内存中

的索引就不存在了。可以在jvm退出之前调用另一个使用FSDirectory的

IndexWriter 把内存中的索引转存到文件系统中。

    相应的API为IndexWriter.addIndexesNoOptimize(Directory[]),注意这个调

用代码要放在内存中索引的操作RAMDirectory的IndexWriter关闭后,以便所有的

document都进入RAMDirectory。在创建RAMDirectory的实例时,可以使用无参的构

造方法,或是有一个参数的构造方法:可以指定一个文件路径,以便加载磁盘中的索

引到内存中。

 

 

*** 4,Highlighter,高亮器,用于高亮显示匹配的关键字。

包含三个主要部分:

1) 格式化器:Formatter(使用SimpleHTMLFormatter,在构造时指定前缀和后缀)。

2) 计分器:Scorer(使用QueryScorer)。

3) 段划分器:Fragmenter(使用SimpleFragmenter,在构造时指定关键字所在的

   内容片段的长度)。

 

通过方法getBestFragment(Analyzer a, String fieldName,String text)实现高亮。

(如果进行高亮的field中没有出现关键字,返回null)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值