Lucene极简入门
1、为什么有Lucene
-
1.1、数据量小的原始搜索:依靠SQL语句直接检索数据库
-
1.2、数据量巨大时应用Lucene方案:数据库就变成了索引库,我们使用Lucene的API的来操作服务器上的索引库。这样完全和数据库进行了隔离 。
2、数据查询方法
-
1、顺序扫描
- 描述:带着关键字,一条一条的比较,逐字匹配,直到找到为止
- 缺点:查询效率低(慢), 随着数据量的大量增长效率会明显降低
- 优点: 准确率高
- 举例:数据库中like查询
-
2、倒排索引
-
描述:把数据库中的所有内容都查询出来,然后进行切分词, 把切开分词组成索引(目录),把内容放到文档对象中,索引与文档组成索引库;检索时,先查询到索引,索引与文档之间有联系,通过联系可以快速确定文档的位置,返回文档,这就是倒排索引算法.
-
通俗的说:
1、在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。例如,文档 1 经过分词,提取了 20 个关键词,每个关键词都会记录它在文档中出现的次数和出现位置。
2、那么,倒排索引就是关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词 -
优点:查询效率高,不会随着数据的大量增长而效率明显降低
-
举例:字典:把所有的字偏旁部首都取出来,组成目录,目录与后面的内容有联系, 通过目录能快速的找到字的详细
-
3、Lucene的组成及索引库
-
Lucene中存的就是一系列的二进制压缩文件和一些控制文件,它们位于计算机的硬盘上, 这些内容统称为索引库 。
-
(1)原始记录
- 存入到索引库中的原始文本,例如:我是张三
-
(2)词汇表
- 按照一定的拆分策略(即分词器)将原始记录中的每个字符拆开后,存入一个供将来搜索的表。
- 标准分词算法:Lucene的标准分词算法,一个一个汉字进行拆分
-
Lucene存放数据的地方我们通常称之为索引库,索引库又分为两部分组成:原始记录和词汇表
-
参考文章: https://juejin.im/post/5aaf21d46fb9a028b86dcf38#comment
4、Lucene查存过程:
-
当我们想要把数据存到索引库的时候,我们首先存入的是将数据存到原始记录上
-
又由于我们给用户使用的时候,用户使用的是关键字来进行查询我们的具体记录。因此,我们需要把我们原始存进的数据进行拆分!将拆分出来的数据存进词汇表中。
-
词汇表就是类似于我们在学Oracle中的索引表,拆分的时候会给出对应的索引值。
-
一旦用户根据关键字来进行搜索,那么程序就先去查询词汇表中有没有该关键字,如果有该关键字就定位到原始记录表中,将符合条件的原始记录返回给用户查看
-
具体说明:将JavaBean对象封装到Document对象中,然后通过IndexWriter把document写入到索引库中。当用户需要查询的时候,就使用IndexSearcher从索引库中读取数据,找到对应的Document对象,从而解析里边的内容,再封装到JavaBean对象中让我们使用