Lucene基础概念

1.什么是全文检索

   全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方法。这个过程类似于通过字典的目录查字的过程。

   将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。

    例如:字典。字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。

    这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-Text Search) 。虽然创建索引的过程也是非常耗时的,但是索引一旦创建就可以多次使用,全文检索主要处理的是查询,所以耗时间创建索引是值得的。

2.什么是Lucene

  Lucene 是 apache 下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能。

3.Lucene适用场景

  1)在应用中为数据库中的数据提供全文检索实现。

  2)开发独立的搜索引擎服务、系统。

4.Lucene特性

  1. 稳定、索引性能高

    1)每小时能够索引150GB以上的数据

    2)对内存的要求小,只需要1MB的堆内存

    3)增量索引和批量索引一样快

    4)索引的大小约为索引文本大小的20%~30%

   2.高效、准确、高性能的搜索算法

     1)良好的搜索排序

     2)强大的查询方式支持:短语查询、通配符查询、临近查询、范围查询等

     3)支持字段搜索(如标题、作者、内容)

     4)可根据任意字段排序

     5)支持多个索引查询结果合并

     6)支持更新操作和查询操作同时进行

     7)支持高亮、join、分组结果功能

     8)速度快

     9)可扩展排序模块,内置包含向量空间模型、BM25模型可选

     10)可配置存储引擎

  3.跨平台

      1)纯java编写

      2)作为Apache开源许可下的开源项目,你可以在商业或开源项目中使用

      3)Lucene有多种语言实现版(如C,C++、Python等),不仅仅是JAVA

5.核心概念:

   Document

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

    Filed

       一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Document中存储的。

       Field有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。

       如果对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。

6.创建索引

    我们以京东购物的搜索为例,在网站上输入关键字搜索显示的内容不是直接从数据库中来的,而是从索引库中获取的,网站的索引数据需要提前创建的。以下是创建的过程:

     第一步:获得原始文档。就是从mysql数据库中通过sql语句查询需要创建索引的数据。

     第二步:创建文档对象(Document),把查询的内容构建成lucene能识别的Document对象,获取原始内容的目的是为了索引,在索引前需要将原始内容创建成文档,文档中包括一个一个的域(Field),这个域对应就是表中的列。

    注意:每个 Document 可以有多个 Field,不同的 Document 可以有不同的 Field,同一个Document可以有相同的 Field(域名和域值都相同)。每个文档都有一个唯一的编号,就是文档 id。

    第三步:分析文档。将原始内容创建为包含域(Field)的文档(document),需要再对域中的内容进行分析,分析的过程是经过对原始文档提取单词、将字母转为小写、去除标点符号、去除停用词等过程生成最终的语汇单元,可以将语汇单元理解为一个一个的单词。

   第四步:创建索引。对所有文档分析得出的语汇单元创建索引,索引的目的是为了搜索,最终要实现只搜索被索引的语汇单元从而找到 Document(文档)。

(注意:创建索引是对语汇单元索引,通过词语找文档,这种索引的结构叫 倒排索引结构。)

7.倒排索引

   倒排索引记录每个词条出现在哪些文档,及在文档中的位置,可以根据词条快速定位到包含这个词条的文档及出现的位置。

   文档:索引库中的每一条原始数据,例如一个商品信息、一个职位信息。

   词条:原始数据按照分词算法进行分词,得到的每一个词。

  创建倒排索引,分为以下几步:

     1)创建文档列表

       lucene首先对原始文档数据进行编号(DocID),形成列表,就是一个文档列表

                                                              

 

2)创建倒排索引列表

   对文档中数据进行分词,得到词条(分词后的一个又一个词)。对词条进行编号,以词条创建索引。然后记录下包含该词条的所有文档编号(及其它信息)。

                                                             

搜索的过程:

     当用户输入任意的词条时,首先对用户输入的数据进行分词,得到用户要搜索的所有词条,然后拿着这些词条去倒排索引列表中进行匹配。找到这些词条就能找到包含这些词条的所有文档的编号。然后根据这些编号去文档列表中找到文档

 

8.查询索引

   第一步:创建用户接口:用户输入关键字的地方

   第二步:创建查询 指定查询的域名和关键字

   第三步:执行查询

   第四步:渲染结果 (结果内容显示到页面上 关键字需要高亮)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值