Lucene学习教程——Lucene介绍

来源:互联网 发布:淘宝买摩托车哪家可靠 编辑:程序博客网 时间:2024/06/05 10:27

一、前言

          学完 Lucene也有段时间了,一直没有总结和复习。当时学Lucene的时候,还蛮懵逼的,光找学习资料就花了两天的时间。毕竟网上的学习资料太多,太杂,不知道看哪个的好。不过还好,也算是学过来了。这里我推荐我学习的时候看的是孔浩老师的视频资料。之前在极客网看的Lucene我觉得新手不好学,反正我是学的很懵,反复的看还是不懂,老师也解释不清楚。废话不多说了,下面进入正题。


二、Lucene介绍(摘自网络)

             我觉得介绍的还不错,至少能够了解什么是Lucene,所以就借鉴过来给大家看看,了解一下;

    2.1 什么是lucene?

         Lucene是一个全文搜索框架,而不是应用产品。因此它并不像  www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。是一款高性能、可扩展的信息检索工具库。信息检索是指文档搜索、文档内信息搜索或者文档相关的元数据搜索等操作。


     2 .2 lucene的工作方式

    lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源。

            2.2.1  写入流程

            源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。将索引写入存储器,存储器可以是内存或磁盘。

            2.2.2  读出流程

             用户提供搜索关键词,经过analyzer处理。对处理后的关键词搜索索引找出对应的Document。用户根据需要从找到的Document中提取需要的Field。

      2.3   lucene有哪些优点?

       (1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。

       (2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。

       (3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。

       (4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。

       (5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。


      2.4 一些需要知道的概念

      2.4.1 analyzer

      Analyzer是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、“the”,中文中的“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。
  分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。

        2.4.2 document

  用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。

        2.4.3 field

        一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Document中存储的。
        Field有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话,事实上对这两个属性的正确组合很重要,下面举例说明:还是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。

        2.4.4 term

  term是搜索的最小单位,它表示文档的一个词语,term由两部分组成:它表示的词语和这个词语所出现的field。

        2.4.5 tocken

        tocken是term的一次出现,它包含trem文本和相应的起止偏移,以及一个类型字符串。一句话中可以出现多次相同的词语,它们都用同一个term表示,但是用不同的tocken,每个tocken标记该词语出现的地方。

        2.4.6 segment

        添加索引时并不是每个document都马上添加到同一个索引文件,它们首先被写入到不同的小文件,然后再合并成一个大索引文件,这里每个小文件都是一个segment。

        2.5  为什么要使用Lucene?

             很多时候,我们在进行搜索的时候,比如说:我们要在数据库中搜索内容含有 “中国”  的句子,如果采用一般的方式,比如说: %中国%,这种模糊查询的sql语句,效率会非常的低,就好像拿到一本字典,然后重头到尾去翻,看哪些含有“中国”。通过情况,我们查字典都是找拼音或偏旁部首来查找,所以使用Lucene全文索引来进行检索。速度回大大的提高。接下来我会介绍如何使用Lucene来创建索引,搜索索引,增删改,自定义分词,同义词搜索等等(速度可能会有点慢,最近有点忙)。


Ps:简单了解了一些Lucene的概念知识后,下面正式进入Lucene的学习。

1 0