目录
2.1、ElasticSearch vs Lucene的关系
1、Lucene简介
1.1、Lucene介绍
Lucene是Apache Jakarta家族中的一个开源项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎,索引引擎和部分文本分析引擎。
Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在java开发环境里
Lucene是一个成熟的免费开源工具,是目前最为流行的基于java开源全文检索工具包。
-
数据总体分为两种:结构化数据:指具有固定格式或有限⻓度的数据,如数据库、元数据等
⾮结构化数据:指不定⻓或⽆固定格式的数据,如邮件、word⽂档等磁盘上的⽂件
-
对于结构化数据的全⽂搜索很简单,因为数据都是有固定格式的,例如搜索数据库中数据使⽤ SQL 语句即可
-
对于⾮结构化数据,有以下两种⽅法:顺序扫描法(Serial Scanning)、全⽂检索 (Full-text Search)顺序扫描法 :如果要找包含某⼀特定内容的⽂件,对于每⼀个⽂档,从头到尾扫描内容,如果此⽂档包含此字符串, 则此⽂档为我们要找的⽂件,接着看下⼀个⽂件,直到扫描完所有的⽂件,因此速度很慢。全⽂检索 :将⾮结构化数据中的⼀部分信息提取出来,重新组织,使其变得具有⼀定结构,然后对此有⼀定结构的数 据进⾏搜索,从⽽达到搜索相对较快的⽬的。这部分从⾮结构化数据中提取出的然后重新组织的信息,我们称之索引。
1.2、Lucene全⽂检索流程
-
创建索引过程,对要搜索的原始内容进⾏索引构建⼀个索引库。索引过程包括:确定原始内容即要搜索的内容 → 采集⽂档 → 创建⽂档 → 分析⽂档 → 索引⽂档。
-
搜索索引过程,从索引库中搜索内容。搜索过程包括:⽤户通过搜索界⾯ → 创建查询 →执⾏搜索,从索引库搜索 → 渲染搜索结果。
1.2.1、创建索引
对⽂档索引的过程,将⽤户要搜索的⽂档内容进⾏索引,索引存储在索引库( index )中。这⾥我们要搜索的⽂档是 磁盘上的⽂本⽂件,根据案例描述:凡是⽂件名或⽂件内容包括关键字的⽂件都要找出来,这⾥要对⽂件名和⽂件内 容创建索引。- 获得原始⽂档:
原始⽂档是指要索引和搜索的内容。原始内容包括互联⽹上的⽹⻚、数据库中的数据、磁盘上的⽂件等。
-
创建⽂档对象:获取原始内容的⽬的是为了索引,在索引前需要将原始内容创建成⽂档( Document ),⽂档中包括⼀个⼀个的域 ( Field ),域中存储内容。 这⾥我们可以将磁盘上的⼀个⽂件当成⼀个 document , Document 中包括⼀些 Field (file_name ⽂件名称、 fi le_path ⽂件路径、 fi le_size ⽂件⼤⼩、 fi le_content ⽂件内容),如下图:
注意:
-
每个Document可以有多个Field,不同的Document可以有不同的Field
-
每个⽂档都有⼀个唯⼀的编号,就是⽂档 id 。
- 分析⽂档:
将原始内容创建为包含域( Field )的⽂档( document ),需要再对域中的内容进⾏分析,分析的过程是经过对原始⽂档提取单词、将字⺟转为⼩写、去除标点符号、去除停⽤词等过程⽣成最终的语汇单元,可以将语汇单元理解为⼀ 个⼀个的单词。 ⽐如下边的⽂档经过分析如下
原⽂档内容:Lucene is a Java full-text search engine. Lucene is not a completeapplication, but rather a code library and API that can easily beused to add search capabilities to applications.分析后得到的语汇单元:lucene 、 java 、 full 、 search 、 engine...每个单词叫做⼀个 Term ,不同的域中拆分出来的相同的单词是不同的 term 。 term 中包含两部分⼀部分是⽂档的域名,另⼀部分是单词的内容。 例如:⽂件名中包含 apache 和⽂件内容中包含的 apache 是不同的 term 。- 创建索引—倒排索引:
对所有⽂档分析得出的语汇单元进⾏索引,索引的⽬的是为了搜索,最终要实现只搜索被索引的语汇单元从⽽找到 Document (⽂档)
注意:创建索引是对语汇单元索引,通过词语找⽂档,这种索引的结构叫倒排索引结构。 传统⽅法是根据⽂件找到 该⽂件的内容,在⽂件内容中匹配搜索关键字,这种⽅法是顺序扫描⽅法,数据量⼤、搜索慢。 倒排索引结构是根 据内容(词语)找⽂档,如下图:倒排索引结构也叫反向索引结构,包括索引和⽂档两部分,索引即词汇表,它的规模较⼩,⽽⽂档集合较⼤。1.2.2、查询索引
查询索引也是搜索的过程。搜索就是⽤户输⼊关键字,从索引( index )中进⾏搜索的过程。根据关键字搜索索引, 根据索引找到对应的⽂档,从⽽找到要搜索的内容(这⾥指磁盘上的⽂件)。- ⽤户查询接⼝:
全⽂检索系统提供⽤户搜索的界⾯供⽤户提交搜索的关键字,搜索完成展示搜索结果。Lucene 不提供制作⽤户搜索界⾯的功能,需要根据⾃⼰的需求开发搜索界⾯创建查询:⽤户输⼊查询关键字执⾏搜索之前需要先构建⼀个查询对象,查询对象中可以指定查询要搜索的 Field ⽂档域、查询关键字等,查询对象会⽣成具体的查询语法,例如: 语法“ fifi leName:lucene” 表示要搜索 Field 域的内容为 “lucene” 的⽂档执⾏查询:搜索索引过程: 根据查询语法在倒排索引词典表中分别找出对应搜索词的索引,从⽽找到索引所链接的⽂档链表。 ⽐如搜索语法为 “ fifi leName:lucene” 表示搜索出 fifi leName 域中包含 Lucene 的⽂档。 搜索过程就是在索引上查找域为 fifi leName ,并且关键字为 Lucene的 term ,并根据 term 找到⽂档 id 列表。渲染查询结果以⼀个友好的界⾯将查询结果展示给⽤户,⽤户根据搜索结果找⾃⼰想要的信息,为了帮助⽤户很快找到⾃⼰的结 果,提供了很多展示的效果,⽐如搜索结果中将关键字⾼亮显示,百度提供的快照等。
1.3、分词器
1.3.1、分词器的作⽤
a. 在创建索引的时候需要⽤到分词器,在使⽤字符串搜索的时候也会⽤到分词器,并且这两个地⽅要使⽤同⼀个 分词器,否则可能会搜索不出来结果。b. 分词器 (Analyzer) 的作⽤是把⼀段⽂本中的词按规则取出所包含的所有词,对应的是Analyzer 类,这是⼀个抽 象类 (public abstract class org.apache.lucene.analysis.Analyzer),切分词的具体规则是由⼦类实现的,所以对于不 同的语⾔规则,要有不同的分词器。1.3.2、英⽂分词器的原理
-
a. 英⽂的处理流程为:输⼊⽂本,词汇切分,词汇过滤 ( 去除停⽤词 ) ,词⼲提取 ( 形态还原 ) 、⼤写转⼩写,结果输 出。b. 何为形态还原,意思是:去除单词词尾的形态变化,将其还原为词的原形,这样做可以搜索出更多有意义的结 果,⽐如在搜索 student 的时候,同事也可以搜索出 students 的结果。c. 任何⼀个分词法对英⽂的⽀持都是还可以的。
1.3.2 中⽂分词器的原理
中⽂分词⽐较复杂,并没有英⽂分词那么简单,这主要是因为中⽂的词与词之间并不是像英⽂那样⽤空格来隔 开,因为不是⼀个字就是⼀个词,⽽且⼀个词在另外⼀个地⽅就可能不是⼀个词,如: " 我们是中国⼈ " , " 是中 " 就不是⼀ 个词,对于中⽂分词,通常有三种⽅式:单字分词、⼆分法分词、词典分词。-
单字分词:就是按照中⽂⼀个字⼀个字的进⾏分词,⽐如 :" 我们是中国⼈ " ,分词的效果就是 " 我 " , " 们 " , " 是 " , " 中
-
-