Lucene技术研究

  • 格式:doc
  • 大小:492.50 KB
  • 文档页数:12

1、lucene是apache下的一个开源框架,主要使用于处理大量资源全文搜索的时间使用的工具。

从其官方网站定义为:Apache的Lucene的是一种基于java语言开发的、高性能、跨平台、几乎适用于任何程序的全文搜索引擎。

并且apache的Lucenea是完全开源的。

当前最新版本是2.4.1。

下边我们首先看一个简单的Lucene的例子。

所有的暂时:2
Document<stored/uncompressed,indexed,tokenized<bookname:“黑西装”直奔克拉厅的柜台前,称要买之前看中的33万元的裸钻。

得知是前一天预约的顾客后,营业员顿时兴高采烈地拿出了裸钻。

“黑西装”取出了自带的放大镜,还拿出了一个镊子,仔细观察钻石的成色。

大约10分钟后,“黑西装”查看结束,将裸钻还给营业员,表示十分满意,提出1小时后来取货。

在“黑西装”查看裸钻的时候,“白夹克”并未凑过来,而是在旁边挑选其他饰品。

>>
Document<stored/uncompressed,indexed,tokenized<bookname:24日早晨,民警追查到,这3人目前正住在闵行区金汇路颐美庭园酒店内。

当天下午3点半左右,民警在306房间内将“黑西装”李银林和“白夹克”万尧荣等3人抓获。

此时距离钻石被盗仅24个小时。

经审问,李银林在拿镊子查看裸钻时,曾利用营业员低头的一刹那,伸手摸了摸自己的裤子口袋———短短几秒钟的时间,他便完成了调包。

>>
1、我们去分析一下该段程序。

a> 首先我们创建一个类IndexWriter,该类是lucene创建索引的核心,其主要功能是将所有的数据源所有内容,经过分词处理,创建成索引格式的文件<同数据库想对比,一个索引文件就相当一张表)
b> 然后,我们定义了document类。

Lucene是将所有的数据源都转换成Document 类型的文件,lucene内部只能识别出Document类型的文件。

<同数据库相比的话,Document就像一个表的每一条记录。


c> 然后我们定义了一些File类,其中File是作为真实的数据存储使用,每一个需要索引的内容都对应一个Filed,<和数据库相比,Field就相当一一条记录的一个属性与其值)。

d> 然后将Field增加到Document中,其中每个Document可以增加到多个Field对象。

然后将所有的Doc交给IndexWriter去创建索引,创建完成后,如图一
图一 lucene索引后的文件
E> 然后开始查询,首先使用IndexReader来读取所创建目录下的索引文件,然后创建一个IndexSearch对象,该对象主要功能就是从索引中查询。

F> 然后定义查询策略,本例中采用queryParse来查询,然后循环,将所有查询的结果打印出来。

1、Document文件
Document是lucene自己定义的一种文件格式,lucene使用docement来代替对应的物理文件或者保存在数据库中的数据。

因此Document只能作为数据源在Lucene中的数据存贮的一种文件形式。

Document只是负责收集数据源,因为不同的文件可以构建同一个Document。

只要用户将不同的文件创建成Document类型的文件,Lucene就能快速找到查找并且使用他们。

对于一个Document文件,可以同时增加多个Field。

Lucene中对于每个数据源是使用Field类来表示的。

多个Field组成一个Document,多个Document组成一个索引文件。

Document与Fi eld关系如果一所示
图片看不清楚?请点击这里查看原图<大图)。

此时,我们去看看Document这个类的源代码。

Document采用默认不带参数的构造函数,但是我们他在创建的时间,
产生两个变量:fields和boost
其中fields是创建了一个arrayList,其主要是保存Field类
Boost主要是设置该doc的优先级
其方法:add<Fieldable field)增加一个field对象
removeField(String name> 根据name移除一个ield对象<找到一个就返回)
removeFields(String name> 根据name移除所有的field对象
Field getField(String name> 根据名字找到该Field对象。

Fieldable getFieldable(String name> 根据名字找到Fieldable子类<Fieldable是
接口,具体有Filed来实现)
String get(String name> 根据名字,找到给Filed对象中包含的内容
public final byte getBinaryValue(String name> 主要查找Doc中包含有二进制field 数据<如果不存在,则返回null)
public final List getFields(> 直接返回该Doc中包含的Field。

Field类<类似数据库中的字段与属性)
该类实现接口:Fieldable 继承静态类: AbstractField
Fieldable接口。

主要是描述一些基础信息的内容
Filed类源代码解读
首先Filed内部定义了三个静态类Store、Index、TermVector。

这是一个与词条有关的类。

因为在检索的时候需要指定检索关键字,通过为一个Field添加一个TermVector,就可以在检索中把该Field检索到。

流程:
首先检查name以及values不能为空以及Nnull。

然后检查是否是存储以及是否分词如果两者都是No,则抛出异常。

然后检查是否存储以及是否向量分词,如果两者都是No',则抛出异常。

然后将该Filed的名称命令传递过来的名称源代码< = name.intern)表示获取JVM String常量池的地址
此时根据Store的值,来设置是否存储以及压缩的值
然后根据Index的值,来设置是否索引、是否分词、omitNorms的值以及置是否是二进制
然后开始根据TermVector 的值,来设置是否存储向量、是否存储偏移量、是否存储位置等信息。

注意:
如果使用高版本的话,对于Field的初始化已经发生改变,如下:
new Field(String name,TokenStream> new Field(String name,String value,Store,Index> 原有的Text,KeyWord已经不存在了:
doc.add(Field.Text("content",new FileReader(f>>>。

doc.add(Field.Keyword("filename",f.getCanonicalPath(>>>。