数据分类
结构化数据:有固定类型或者有固定长度的数据
例如:数据库中的数据(mysql,oracle等), 元数据(就是windows中的数据)
结构化数据搜索方法:
数据库中数据通过sql语句可以搜索
元数据(windows中的)通过windows提供的搜索栏进行搜索
非结构化数据:没有固定类型和固定长度的数据
例如: Word文档中的数据, 邮件中的数据
非结构化数据搜索方法:
Word文档使用ctrl+F来搜索
顺序扫描法:
Ctrl+F中是使用的顺序扫描法,拿到搜索的关键字,去文档中,逐字匹配,直到找到和关键字一致的内容为止.
优点: 如果文档中存在要找的关键字就一定能找到想要的内容
缺点: 慢, 效率低
全文检索算法(倒排索引算法):
将文件中的内容提取出来, 将文字拆封成一个一个的词(分词), 将这些词组成索引(字典中的目录), 搜索的时候先搜索索引,通过索引找文档,这个过程就叫做全文检索.
分词: 去掉停用词(a, an, the ,的, 地, 得, 啊, 嗯),因为搜索的时候搜索这些词没有意义,将句子拆分成词,去掉标点符号和空格
优点: 搜索速度快
缺点: 因为创建的索引需要占用磁盘空间,所以这个算法会使用掉更多的磁盘空间,这是用空间换时间
全文检索的原理类似是我们使用的字典,有目录和正文两部分组成,查询的时候先查询目录,然后根据目录查询页数,根据页数查询我们需要的内容。
什么是Lucene?
Lucene是apache下的一个顶级开源项目,提供了一个全文检索引擎工具包,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供的一个简单易用的工具包,以方便的在目标系统中实现全文检索功能。
使用场景
对于数据量大、数据结构不固定的数据采用全文检索方式搜索,比如百度、Google等搜索引擎、论坛站内搜索、电商网站站内搜索等。
Lucene应用领域
1.互联网全文检索引擎(比如百度, 谷歌, 必应)
2.站内全文检索引擎(淘宝, 京东搜索功能)
3.优化数据库查询(因为数据库中使用like关键字是全表扫描也就是顺序扫描算法,查询慢)
Lucene实现全文检索的流程
需要我们注意的是在索引库中存储了两部分内容:索引和原始文档的内容
1、获得原始文档
原始文档是指要索引和搜索的内容。原始内容包括互联网上的网页。数据库中的数据。磁盘上的文件等,我们获取的过程就是一个流的操作
2、 创建文档对象
获取原始内容的目的是为了索引,在索引前需要将原始内容创建成文档(Document),文档中包含一个一个的域(field),域中存储内容。这里我们可以将磁盘上的一个文件当成一个document,Document中包括一些Field(file_name 文件名称 file_path 文件路径 file_size 文件大小 file_content 文件内容)如下图:
注意:对于field的要求应该和数据库中的定义区分 不同的Document可以有不同的Field。同一个Document可以有相同的Field(域名和域值都相同),每个文档都有一个唯一的编号,就是文档id,文档的id增长方式为自增长,每次加一,从零开始。
3、分析文档
将原始文档创建为包含域的文档,需要在对域中的内容进行分析,分析的过程是经过对原始文档提取单词,将字母转换为小写,取出标点符号,取出停用词等过程生成最终语汇单元,可以将语汇单元理解为一个一个的单词。
每个单词叫做一个term,不同域中拆分出来的相同的单词是不同的term,term中包含两部分 一部分是文档的域名,另一部分是单词的内容。
4、创建索引
对所有的文档分析得出的语汇单元进行索引,索引的目的是为了搜索,最终实现只搜索被索引的语汇单元从而找到文档。大致过程如下:
倒排索引
查询索引
查询索引也是搜索的过程。搜索就是用户输入关键字,从索引(index)中进行搜索的过程,根据关键字搜索索引。根据索引找到对应的文档,从而找到要搜索的内容
小结
本文对lucene进行了简单的介绍,总结了整体的检索流程,让我们对全文搜索中涉及到的一些基本概念有了一定的了解,在下面一篇博客中,我们会详细介绍域的概念,因为这个概念是我们经常使用的,希望能给读者一些收获