Lucene
一、全文检索
-
数据的分类
- 1 结构化数据
- 格式固定,长度固定、数据类型固定
- 比如数据库中的数据
- 2 非结构化数据
- 格式不固定、长度不固定、数据类型不固定
- 比如 word、PDF、邮件、HTML、txt
- 1 结构化数据
-
数据的查询
- 1 结构化数据的查询
- SQL语句,查询结构化数据的方法,简单,速度快
- 2 非结构化数据的查询
- 从文本文件中找出包含指定单词的文件
- 目测
- 使用程序把文档读取到内存中,然后匹配字符串。属性扫描。
- 把非结构化数据编程结构化数据
- 先根据空格进行字符串拆分,得到一个单词列表,基于单词列表创建一个索引。
- 根据单词与索引的对应关系找到文档列表,这个过程叫做全文检索。
- 索引:一个为了提高查询速度,创建某种数据结构的集合。
- 从文本文件中找出包含指定单词的文件
- 1 结构化数据的查询
-
全文检索
- 先创建索引后然后查询索引的过程叫做全文检索
- 索引创建一次,可以
多次查询
,表现为每次查询的速度都很快
二、全文索引的应用场景
-
搜索引擎
- 百度、谷歌
-
站内索引
- 论坛搜索、微博、文章搜索
-
电商搜索
- 淘宝搜索、京东搜索
-
只要是有搜索的地方就可以使用全文检索技术
三、Lucene
Lucene是一个基于java开发的全文检索工具包。
四、Lucene实现全文检索的流程
-
创建索引
-
1 获取文档
- 原始文档:基于哪些数据进行检索,那么这些数据就是原始文档
- 搜索引擎:使用爬虫来获取原始文档
- 站内搜索:数据库中的数据
- 案例:直接使用IO流来读取磁盘上的文件
-
2 构建文档对象
- 对应每个原始文档来创建一个document对象
- 每个document对象中包含多个域(field)
- 域中保存的就是原始文档的数据
- 域的名称
- 域的值
- 每个文档中都有一个唯一的编号,就是文档的id
-
3 分析文档
- 分词的过程
- 根据空格进行字符串的拆分,得到一个单词列表
- 把单词全部转化为小写
- 去除标点符号
- 去除停用词:无意义的词
- 每个关键词都封装成一个term对象中
- term包含两部分内容:
- 关键词所在的域
- 关键词本身
- 不同的域中拆分出来的相同的关键词是不同的term
- term包含两部分内容:
- 分词的过程
-
4创建索引
- 基于关键词列表创建一个索引,保存到索引库中。
- 索引库中包含:
- 索引
- document
- 关键词和文档的对应关系
- 通过词语查找文档,这种索引的结构叫做倒排索引结构
-
-
查询索引
- 用户查询接口
- 用户输入查询条件的地方
- 例如:百度的索引框
- 把关键词封装成一个查询对象
- 要查询的域
- 要搜索的关键词
- 执行查询
- 根据要查询的关键词到对应的域上进行搜索
- 找到关键词,根据关键词找到对应文档
- 渲染结果
- 根据文档的id找到文档对象
- 对关键词进行高亮显示
- 分页处理
- 最终展示给用户看
- 用户查询接口
五、入门程序
-
创建索引
- 环境:
- 下载Lucene程序
- 最低要求jdk1.8
- 工程搭建
- 创建一个java工程:
- 添加jar包:core 、analyzers 、commons-io.jar
- 步骤:
- 创建一个directory对象,指定索引保存的位置
- 基于Directory对象创建IndexWriter对象
- 读取磁盘上的文件,对应每个文件创建一个文档对象
- 向文档对象中添加域
- 把文档对象写入索引库
- 关闭IndexWriter对象
- 环境:
-
使用luke查看索引库中的内容
- jdk9
-
查询索引库
- 步骤
- 创建一个directory对象,指定索引库的位置
- 创建一个IndexReader对象
- 创建一个IndexSearcher对象,构造方法中的参数:IndexReader
- 创建一个Query对象,TermQuery
- 执行查询,得到查询结果,TopDoc对象
- 获取查询结果的总记录数
- 取文档列表
- 打印文档中的内容
- 关闭indexReader对象
- 步骤
六、分析器
默认使用的是标准分析器StandardAnalyzer
-
查看分析器的分析效果
- 使用Analyzer对象的tokenStream方法返回一个tokenStream对象,词对象中包含了最终分词结果
- 实现步骤
- 创建Analyzer对象,StandardAnalyzer对象
- 使用分析器对象的tokenStream方法获得TokenStream对象
- 向TokenStream对象中设置一个引用。相当于一个指针
- 调用TokenStream对象的rest方法,如果不调用,会抛出异常
- 使用while循环遍历TokenStream对象
- 关闭TokenStream对象
-
IKanalyzer的使用方法
- 把IKAnalyze入队jar包添加到工程中
- 把配置文件和扩展词典都添加的工程的classpath下
- 扩展词典严禁使用windows记事本编辑,保证扩展词典的编辑格式是utf-8
- 扩展词典:可以添加一些新词
- 停用词词典:无意义的词、敏感词汇
七、索引库的维护
- 添加文档
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 平谷の博客!