it计算机]基于lucene的桌面搜索引擎内容摘要:

在这样的调用中, Lucene 会首先对所要建立索引的数据进行分析( analysis)以使得在建立索引时可以更加容易地处理这些数据,然后索引器会按Lucene 所规定的索引格式将数据写入索引文件。 Lucene 的文档格式 在前面已经提到了两个概念: Document(文档)和 Field(字段)。 Document 和 Field 在 Lucene的索引过程中占有举足轻重的地位,而且,在 Lucene 的搜索部分也会涉及到相应的概念,因此可以说深入理解它们是使用 Lucene 的基础,下面将分别进行介绍。 文档 ( Document) 假设现在要对一些文本文件建立索引,首先需要确定索引的数据源。 对文本文件来说,数据源可以是文件名,文件的内容,文件的最后修改时间等。 对于每个不同的文件,这些数据源将提供出不同的内容,以便将来存储在索引中。 在 Lucene 中,可以把一个 Document 看作是这些不同内容的集合,而“ 文件名”,“文件内容”等名称可以看成是对不同数据源进行分类的标记,在 Lucene 中我们把这些标记称为 Field。 从根本上来讲, Lucene 的 Document 代表了一个需要进行索引的“单元”,任何需要进行索引的“文件”都必须被转化成 Document 对象才能够被索引和搜索到。 需要注意的是,此处在“文件”二字上加了引号,这是因为并非只有文件才能转化为 Document 类型,任何数据源经过组织都可以构建一个 Document 类型。 更进一步说, Lucene 并不为任何实际物理文件建立索引,而只对 Document对象建立索 引。 所以,建立索引的第一步就是将不同的数据源组织为一个 Document 类型的对象。 其实,可以把 Document 对象看成一种虚拟的文件,它自身带有多个数据源。 从文件能够提供数据源这个角度上来看, Document 对象与实际的物理文件基本相似,不同之处仅仅在于 Lucene 无法识别普通的物理文件而能识别一个 Document 类型的对象而已。 假设现在需要对一个网页执行建立索引的操作,以便在将来可以搜索到这个网页的相关内容,那么我们就需要先把这个网页转换成一个 Document 对象。 经过分析可以知道,该网页主要有几个属性 (也就是数据源)可能在将来检索时会用到,分别是网页的标题,网页的 URL,网页的内容和网页的最后修改时间。 因此,在为这网页构建 Document 对象时就应当包含这几个不同的 Field。 基于 Lucene 的桌面全文搜索 引擎研究 11 Document 的基本使用方法:在 document()方法中首先构造了一个 Document 类型的实例,然后依次往 Document 对象中添加了 path, modified 和 contents 3 个 Field,这些 Field 在以后搜索时都将用到,最后返回生成的 Document 类型的对象 doc。 在对 Document 添加 Field 时,使用的 是 Document对象的 add( Field fld)方法,例如,在添加 path 信息到 doc 对象中时,先通过 ()方法获取到了文件的路径,再用 Field 类自带的静态方法构造出一个 Field 实例,然后将其传给 add 方法以完成添加。 字段( Field) 正如前面所述,字段( Field)是与文档( Document)紧密相连的一个概念,在一个 Document中,它代表了不同数据源的名称。 然而,在现实中,数据源所提供的数据并不是以一种一成不变的方式进行处理,对于不同的字段,人们所希望处 理的方式并不相同。 对于每个 Field, Lucene 提供了 3 种方式以供用户选择进行处理,这 3 种方式分别是被称为“是否切词”,“是否索引”和“是否存储“。 从意义上我们并不难理解这 3 种方式。 a.“是否切词” 表示在这个 Field 中的数据是否需要被切词。 b.“是否索引” 表示在这个 Field 中的数据是否在将来检索时需要被我们检索到,一个“不索引”的 Field 通常仅提供辅助信息储存的功能。 c.“是否存储” 则表示该 Field 内的信息是否要被原封不动的保存在索引中。 Lucene 的 Field 类提供的构造方法支持 用户构造不同类型的 Field,但更为常见的是使用 Field类所提供的静态方法来构造所需要的字段。 在 Field 中,通过静态方法定义了 4 种不同类型的字段Text、 Keyword、 UnIndexed 和 UnStored 可供使用,这 4 种字段在是否切词、是否索引以及是否存储等方面都有所不同,因此四种字段各有不同的用途。 下面是详细介绍: (1) Text Text 类型的字段代表一段需要被切词和索引的内容,这也就说明了这种类型的字段可被搜索。 但是,对于这个字段的大小一定要格外小心,因为 Text 类型的字段有两个不同的构 造函数: Field. Text( String, String)和 Field. Text( String, Reader)。 如果被索引的字段是 java 中的 String 类型,那么它不仅会被索引,同时也会被存储起来,但如果是由 java 里面的 Reader 类型来为该字段提供数据源,那么它就会被索引,而不会被存储起来了。 这一点在使用中往往引起一些混淆,因此在使用 Text 类型的字段时一定要注意这些区别。 通常, Field. Text( String, Reader)用在从某个文本流数据源中获取数据,数据量一般会比较大,而在将来 用户可能并不需要重现它的内容,仅是希望对其中的内容做全文检索,所以不需要去存储数据源的内容。 但是希望存储数据源的内容,则只能先将其中的内容取出来保存在一个 String 中,再使用 Field. Text( String, String)来构建需要的字段。 (2) Keyword Keyword(关键字)类型的字段不会被切词,但是会被索引并且完整的存储在索引中。 这种类型的字段适合于连接地址 URLs、文件系统路径信息、时间日期、人名、居民身份证号码,电话号码等。 基于 Lucene 的桌面全文搜索 引擎研究 12 例如,需要存储一个文件的路径名信息,因为文件的路径 名信息是不需要切分词的(而且切分词后反而失去了其意义),但是文件的路径名信息是需要索引和存储的,因此就可以把文件的路径名信息存储到 Keyword类型的字段中。 通常情况下,可以通过 Field. Keyword( String fieldname, String Keyword)或 Field. Keyword( String fieldname, Data data)(专门针对日期型的关键字)这两个静态方法来构造 Keyword 类型的字段。 (3) UnIndexed UnIndexed 类型的字段既不会被切词,也 不会被索引,但是它的值还是会原封不动的存储在索引中。 在 Field 中使用 Field. UnIndexed( String, String)静态方法来构建这种类型的字段。 这种类型适合于处理需要和搜索结果显示在一起的内容,比如说在一个网页建立索引时可以将这个网页的URL 引用地址添加到 UnIndexed 类型的字段中。 这样在搜索到与这个网页相关的内容时,就可以将这个引用地址与搜索结果一起显示出来。 (4) UnStored Field 中通过 Field. UnStored( String, String)方法来构造一 个 UnStored 类型的字段。 UnStored类型的字段与 UnIndexed 类型的字段刚好相反,它会被切词也会被索引,但是并不会被存储在索引中。 这种字段适合于索引那些并不需要以原有的形式来重视原始数据的大规模文本,比如网页的主体部分或者是内容庞大的文本文档。 在表 中对不同类型的字段进行了比较,表格中包含各个字段的特性以及通常使用的例子。 字段类型 /方法 是否被分词 是否被索引 是否被存储 用途 Field. Keyword( String name, String value) Field. Keyword( String, Data) 否 是 是 电话号码、居民身份证号码、人名、地名、日期 Field. UnIndexed ( String , String) 否 否 是 文档的类型,例如: Word、 PDF、Html Field. UnStored ( String , String) 是 是 否 文档的标题和内容 Field. Text( String, String) 是 是 文档的标题和内容 Field. Text( String, Reader) 是 是 否 文档的内容 表 不同字段类型比 较、特性以及用途 当使用 Field 类所提供的静态方法来构造不同的字段时,所有的字段类型都有两个构造参数,分别代表字段名和值,也就是我们在前面提到的“键 /值”对。 另外,正如表格中所列举的, Keyword类型的字段除了可以接受 String 类型的参数作为字段值外,还可以接受 Data 类型的参数作为字段值,而 Text 类型的字段也可以接受 String 类型或者 Data 类型参数作为字段值。 假设现在需要对一个网页建立索引,该网页已经被封装为一个 Page 类型的对象。 我们可以从这个 Page 类型的对象中得到的信息包括:网页的标题 、网页的创建时间、网页的 URL 地址和网页的内容信息。 基于 Lucene 的桌面全文搜索 引擎研究 13 Lucene 的索引部分是为 Lucene 的搜索部分服务的,因此与 Lucene 的搜索部分密切相关,所以在建立索引时就应该考虑到搜索时的操作,这样才能够建立起恰当的索引字段类型。 而且关于 Lucene字段类型的使用也并没有统一的法则,每个人对如何使用各个字段类型都会有不同的理解,所以要深刻理解并能够灵活应用各个字段类型还需要在实际使用中逐渐积累经验。 索引的添加 —— IndexWriter 类 IndexWriter 类是 Lucene 中最重要的类之一,它 的功能就是将文档加入索引,同时控制索引过程中的各种参数。 初始化 IndexWriter 类的初始化过程并不复杂,它本身提供了多种构造函数。 可以很方便地构造一个IndexWriter 的对象。 通常情况下, IndexWriter 的构造函数包括了以下 3 个参数。 IndexWriter 需要知道它要把索引创建在什么地方,因此,索引存放的路径也就必不可少。 这个路径可以是一个 String 型的目录位置,也可以是经过封装的 对象,同时,还可以是Lucene 自带 的 Directory 类型的对象。 前面说过,建立索引前首先要对文本进行分析。 因此,一个合适的分析器也就必不可少了。 IndexWriter 的构造函数中不可缺少的一项就是一个继承字 Analyzer 类的分析器。 它的主要功能是在IndexWriter 将文档写入索引前,把文本信息切分成一个个可以进行索引的词条。 IndexWriter 在建立索引时,需要知道是重新建立索引,还是进行增量的索引。 通过指定一个布尔型的值,就可以完成这一任务。 当该布尔型的值为 ture 时, IndexWriter 不管目录内是否已经有索引了,一律清空,重新建立;而当布尔型的值为 false 时,则 IndexWriter 会在原有基础上增量添加索引。 向索引添加文档 在前面已经了解了 Lucene 中的 Document 和 Field 的概念,同时,也知道了 Lucene 是借助与IndexWriter 的帮助来向索引中添加数据的。 接下来,就来看看 IndexWriter 四如何把一个个 Document对象加入索引中的。 首先创建 Document 对象,并分别为每个对象创建字段。 然后,初始化一个 IndexWriter 的对象,并确定 一个目录作为索引的存放目录,同时使用 StandardAnalyzer 作为其默认的分析器,并且设置IndexWriter 清除原目录内的所有已有索引重新建立。 接下来,调用 IndexWriter 的 addDocument 方法来向索引中添加文档。 向索引中添加文档相当方便,只需要重复使用 IndexWriter 的 addDocument方法就可以完成一切建立索引的过程。 需要特别注意的是,当执行完 addDocument 方法后,千万不能忘记调用 IndexWriter 的 close 方法来关闭它。 因此会发现索引目录内除了一个 Segment 文件外什么都没有。 只有在调用了 close 方法后,索引器才会将存放于内存中的所有内容写入磁盘并关闭输出流。 基于 Lucene 的桌面全文搜索 引擎研究 14 Lucene 的索引文件格式简述 Lucene 的索引有其固定的格式,下面就简单的进行介绍。 段( Segment) Segment 是 Lucene 索引文件中最基本的一个单位。 一个 Segment 是一个独立的索引,可以由IndexSearcher 进行单独的查找。 Lucene 的工作其实就是不停地往磁盘中加入新的 Segment,然后再按一定的算法合并不同的。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。