上一章说过了什么是全文检索和全文检索应用的场景有哪些.这章主要来简单的实现一把全文检索. 了解流程及步骤.
上图.
![](https://img.haomeiwen.com/i7115372/bdc9e33270bedc7f.png)
从左至右开始逐个分析.
绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括:
确定原始内容即要搜索的内容采集文档创建文档分析文档索引文档
红色表示搜索过程,从索引库中搜索内容,搜索过程包括:
用户通过搜索界面创建查询执行搜索,从索引库搜索渲染搜索结果
- 原始文档
- 简单的理解为原始的数据.
- 创建索引
- 获得文档
- 比如通过爬虫获取的数据文档,数据库中的数据, 或者直接使用 IO 流读取磁盘上的文件.来获得文档.
- 构建文档对象
- 获得原始内容的目的是为了索引, 在索引前需要将原始内容创建成 Document ( 文档 ), 文档中包含了一个或多个 Field ( 域 ), 域中存储的是内容.
- 可以将磁盘上的一个文件当做一个 Document, Document 中包括 Field, Field 是以域名和域值的形式存在. 比如其中一个 Field (name="filename" value = "spring.txt")
- 每个 Document 可以有多个 Field , 不同的 Document 可以有不同 Field , 同一个 Document 可以有相同的 Field (域名和域值都相同). 每个 Document 都有一个唯一的编号, 就是文档的 ID.
- 分析文档(分词)
- 将原始内容创建为包含 Field ( 域 ) 的 Document ( 文档 ), 需要再对域中的内容进行分词, 分析的过程是经过对原始文档提取单词, 大小写转换, 去除标点符号, 禁用敏感词等一系列的操作最终生成的语汇单元, 可以将语汇单元理解为一个一个的单词. 然后每个单词又被封装为一个个的 Term 对象
- 不同的 Field 中拆分出来的相同的单词, 是不同的 Term
- Term 中包含两部分, 一部分是文档的域名, 一部分是单词的内容.
- 创建索引
- 对所文档分析等出的语汇单元进行索引. 索引的目的是为了搜索. 最终要实现只搜索被索引的语汇单元从而找到 Document.
- 注: 创建索引是对语汇单元索引, 通过词语找到文档, 这种索引的结构叫倒排索引结构
- 传统方法是根据文件找到该文件的内容, 然后在文件中匹配搜索关键字, 这种方法是顺序扫描方法. 当数据量大的时候, 搜索就会变的特别慢.
-
倒排索引结构也叫反向索引结构, 包括索引和文档两部分, 索引及词汇表, 规模较小, 文档集合较大.
倒排索引
- 如上图所示, 包含 Lucene 词的 文档有: 2,3,10,35,92
- 获得文档
- 查询索引
- 用户查询接口
- 全文检索系统提供给用户搜索的界面, 供用户提交搜索的关键字, 搜索完成展示搜索结果.
- Lucene 不提供用户搜索界面的功能, 需要根据需求自己开发搜索页面.
- 创建查询
- 用户输入完关键字进行查询之前, 需要先构建一个查询对象, 查询对象中可以指定要查询搜索的域, 关键字等等. 查询对象会生成具体的查询语法.
- 例 "file_name":"lucene" 表示要检索 field_name 域内容为 lucene 的文档
- 执行查询
- 就是搜索索引的过程
- 根据查询语法在倒排索引词典中分别找出索引词的索引, 从而找到索引说链接的文档链表.
- 比如搜索为"fileName : Lucene" 表示搜索出 fileName 域中包含 Lucene 的文档, 搜索过程就是在索引上查找域为 fileName, 并且关键字为 Lucene 的 Term, 并根据 Term 找到文档 ID 列表.
- 渲染结果.
- 最后就是将查询出来的结果以一个友好的界面展示给用户.
- 用户查询接口
这里及是 Lucene 全文检索的一个基本的流程, 下一章会用代码实现 Lucene 全文检索的基本创建,查询,删除,修改等过程.
网友评论