博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lucene(一):概述
阅读量:2241 次
发布时间:2019-05-09

本文共 3018 字,大约阅读时间需要 10 分钟。

以下图片均来自极客学院视频截图:

一、全文检索概述

1.1 数据分类

数据分类可以分为:

结构化数据:具有固定格式或有限长度的数据(例如数据库中的表)

非结构化数据:不定长度或无固定格式的数据(例如邮件、word文档、网页这些类型的数据)
半结构化数据:介于结构化与非结构化之间(例如xml、json格式的数据)

对于想数据库这种结构化数据我们通常使用sql语句来进行检索,对于非结构化的数据我们通常有“顺序扫描”和“全文检索”的方式来检索数据。

顺序扫描:从第一条一直检索到最后一条,然后把符合检索要求的结果返回,可想而知这种方式无论是从时间上还是资源上都会有很大的浪费。

全文检索的过程如下图。左边是把结构化数据与非结构化数据以及半结构化数据通过lucene来创建出索引文件,右边是通过获取用户检索的关键字去检索索引库然后把结果返回给用户。这幅图中起到关键作用的就是“索引”。

在这里插入图片描述

索引的含义:下图的意思是,“Lucene”这个这个词在第1篇文档与第3篇文档出现过,“Hadoop”这个词在第3、5、7、8、9这五篇文档中出现过,这幅图的左侧就好比“新华字典”的拼音检索或部首检索,图的右边称为“倒排表”。对于下图这一个整体的功能我们称为“反向索引”-----这种由字符串到文件的映射是文件到字符串映射的反向过程。

在这里插入图片描述

1.2 全文索引过程

1.2.1 创建索引

创建索引的三部曲可以总结为以下三步

  1. 需要检索的数据(Documents)
  2. 分词技术(Analyzer)
  3. 索引创建(indexer)
    在这里插入图片描述

例如:

a. 需要检索的数据Documents为(极客学院课程、Lucene案例开发、Lucene实时搜索)

b. 分词技术(这里是标准分词,标准分词就是把中文分成一个个独立的单词,对英文就是转换成词根)

极|客|学|院|课|程
Lucene|案|例|开|发
Lucene|实|时|搜|索

c. 创建索引文件

在这里插入图片描述
因为lucene这个词在第2、3两篇文档中都出现过,把它合并成如下图(Lucene这个词的首字母L编程小写是分词技术的作用)
在这里插入图片描述

1.3 全文检索实例

上面的所以表以及创建好了,那么如何基于这个所以表进行检索呢?

检索步骤可以总结为下图:

  1. 搜索的关键字(keywords)
  2. 分词技术(Analyzer),注意这里的分成技术要与创建索引时使用的分词技术尽量相同
  3. 检索索引(Search)
  4. 返回结果
    在这里插入图片描述

例如:

a. 获得用户搜索的关键字(Lucene案例)

b. 分词技术

lucene|案|例

c. 检索索引

通过索引文件可以知道,lucene这个词在第2、3篇文章里出现过,“案”字和“例”字都在第2篇文章出现过
在这里插入图片描述

d. 返回结果是第2篇文章

二、Lucene数学模型

通过1.2 我们了解了全文检索的过程,了解了全文检索的过程再学习Lucene的全文检索,在学习Lucene的全文检索之前,我们先学习一下Lucene的数学模型。

2.1 什么是文档、域、词元 以及他们三者之间的关系

2.1.1 文档

文档是Lucene索引和搜索的原子单位,文档为包含一个或多个的容器,而“域”则依次包含“真正的”被搜索的内容(指的是词元),域值通过分词技术处理,得到多个词元

2.1.2 文档、域、词元之间的关系

例如:一篇小说信息可以称为一个文档,小说信息又包含多个域,比如标题、作者、简介等,对标题这个域采用分词技术,又可以得到一个或多个词元(词元是真正被搜索的内容)

2.2 词元权重计算

权重:词元对文档的重要程度。

Term Frequency(tf):即此term在文档中出现的次数,tf越大,说明该词元越重要。
Document Frequency(df):即有多少文档包含此term,df越大,说明该词元越不重要。

计算公式:

在这里插入图片描述
Wt,d 词元t在文档d中的权重
tft,d 词元t在文档d中出现的次数
n 索引中文档的总数
dft 有多少篇文档包含词元t

在上面我们可以知道一篇文档可以分解为多个词元,再根据此公式我们就可以把词元转换成权重,也就是说一篇文档可以表示成词元的权重,因此就可以把文档表示成权重的向量,也就是下面所说的空间向量模型。

2.3 空间向量模型

把文档表示成向量,把向量放到空间模型中。这个空间向量模型分为N个维度,每一个维度代表一个词元,N代表所有的文档分成的词元总数,这样一篇文档就可以在这个N维空间中表示成一个向量。假如一篇文档它不包含term2,那么他在term2上的权重就是0。

在这里插入图片描述

2.4 索引检索

如何基于2.3的空间向量模型去检索

对于搜索关键字采用同样的分词技术把关键字分成N个词元,依次计算词元的权重,把搜索关键字表示在这个N维空间向量模型中,这样我们就可以用词元原文档之间的夹角来表示它们之间的相似度,这里我们使用夹角的余弦值作为相关性的打分标准,夹角越小,余弦值越大,打分越高,相关性越大。对于这样一个空间向量模型它不仅仅可以用于全文检索,它还能用于“舆情分析领域”的语句情感分析,在“数据挖掘领域”的文本分类算法。

三、Lucene文件结构

前面接收了lucene的数学模型,了解了lucene是基于什么样的原理来完成全文检索的。lunce是如何保存上面所说的空间向量信息,在计算机中以什么样的形式存在。

3.1 层次结构

  1. 索引(Index):一个索引放在一个文件夹中
  2. 段(Segment):一个索引可以有很多段,段与端之间是独立的,添加新的文档可能产生新的段,不同的段可以合并成一个新段。
  3. 文档(Document):文档是创建索引的基本单位,不同的文档保存在不同的段中,一个端可以包含多个文档。
  4. 域(Field):一个文档包含不同类型的信息,可以拆分开索引。
  5. 词(Term):词是索引的最小单位,是经过词发分析和语言处理后的数据。

可以结合上面2.1.2进行理解。这里再介绍一下索引、段 和 文档、域、词元之间的关系,为了方便理解,以我们熟悉的数据库进行举例

索引相当于数据库中的表,当表中的记录达到一定的程度我们需要对表做分区处理,这里的段也就相当于表中的分区,因此也就说索引可以分成多个段,数据表中的记录又保存在不同的分区中,这里的段和数据表中的分区有一个明显的区别,就是不同的段可以合并成一个新段,数据表中的分区又包含了不同的文档,这里也是一样,不同的文档保存在不同的段中,因此这五个名称之间的关系也就是:一个索引可以包含一个或多个段,每个段中又保存了不同的文档,每一篇文档又可以包含不同类型的信息(也就是域),对于域值我们采用词法分析和语言处理可以把域值拆分成多个词元。

3.2 正向信息

在lucene索引中,保存了索引到词的这种关系我们把它称之为“正向信息”,准确的说正向信息就是按层次保存了索引一直到词的包含关系。索引–>段–>文档–>域–>词

3.3 反向信息

索引中不仅保存了“索引–>词”这种正向信息,同时也保存了“词–>索引”这种反向信息。

反向信息保存了词典的倒排表映射:词–>文档
在这里插入图片描述

3.4 示例

这里的索引文件都在index目录下,可以看到我们在个索引里只包含一个段segment_1

在这里插入图片描述
通过lukeall这个工具可以查看索引
在这里插入图片描述

四、Lucene开发环境的搭建

第一步:创建一个基于maven的web程序

第二步:引入lucene依赖,案例中使用的是4.3.1版本

在这里插入图片描述

转载地址:http://hgqbb.baihongyu.com/

你可能感兴趣的文章
leetcode 130. Surrounded Regions
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
【JMeter】1.9上考试jmeter测试调试
查看>>
【虫师】【selenium】参数化
查看>>
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Loadrunner】性能测试报告实战
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>
【手机自动化测试】monkey测试
查看>>
【英语】软件开发常用英语词汇
查看>>
Fiddler 抓包工具总结
查看>>
【雅思】雅思需要购买和准备的学习资料
查看>>
【雅思】雅思写作作业(1)
查看>>
【雅思】【大作文】【审题作业】关于同不同意的审题作业(重点)
查看>>
【Loadrunner】通过loadrunner录制时候有事件但是白页无法出来登录页怎么办?
查看>>
【English】【托业】【四六级】写译高频词汇
查看>>
【托业】【新东方全真模拟】01~02-----P5~6
查看>>