第2章 Lucene基础
2.1 背景
第1章介绍了许多不同的搜索算法。搜索某个文件中的单词或者短语其实并不复杂,比如,Grep文本搜索工具用来处理简单少量的文档是足够的。但是那些拥有海量数据的系统呢?每个行业每天都会产生大量的数据,比如:
● Google每秒执行几万次搜索查询;
● Facebook中每分钟有上百万个视频上传;
● 程序化广告系统中每天产生上百亿条广告日志记录。
收集和存储如此庞大的数据量,只有在你能够从中提取有用信息,并帮助用户获得商业利益的情况下才是有价值的。很明显,实现这一目标最重要的工具就是搜索引擎。一般来说,搜索引擎包含以下4个功能。
● 爬虫(Crawl)子系统:根据互联网的URL(Uniform Resource Locator,统一资源定位符)不断使用BFS或者DFS扩展搜索结果,并进行元数据保存。
● 索引子系统:基于元数据,解析数据、构建索引,索引表可以帮助搜索引擎快速检索相关信息。常见的索引方式有正排索引(又称正向索引)和倒排索引(又称反向索引)。
● 检索子系统:将用户输入的查询语句转换成查询(Query)对象,然后在索引子系统中进行查找并返回关联结果,这个阶段称为初筛。
● 排名子系统:在检索结果的基础上,基于文档权重等元信息进行排序,并返回符合用户期望的搜索结果。
对于正排索引和倒排索引,可以通过图书的例子进行理解。图书的目录是正排索引结构,它通过一个列表展示本书包含哪些章节,以及各章节的页码。书后的索引则是倒排索引结构,它列出图书包含的重点单词,并给出相应单词在书中出现的页码。
Lucene是一个提供索引和搜索功能的库。图2-1中列出了一些重要的组件。
● 全文搜索(Full-Text Search):不仅允许通过文档标题搜索文档,并且允许根据内容对文档进行搜索。它通过遍历文档中所有的单词来显示与请求相关的信息。(详见第5、7章)
● 分析器(Analyzer):允许将字符串转换为可以添加到倒排索引中的标记(Token)。(详见第4章)
● 倒排索引(Inverted Index):分析器生成的标记对象将由索引模块构建分词倒排索引。(详见第3章)
● 查询解析器(QueryParser):将人类可读的查询字符串解析为符合搜索结构的对象。它支持丰富的表达方式,能够提供灵活且强大的查询功能。(详见第4、5章)
● 布尔逻辑表达式(Boolean Expression):允许用户构建语义复杂的查询。它允许用户通过逻辑运算符(如AND、OR和NOT)组合多个条件来进行精确、复杂的查询。(详见第4、5章)
● 搜索器(Searcher):检索倒排索引、返回查询数据。它支持短语查询、模糊查询等。(详见第5章)
● 评分器(Scoring):计算文档与查询词的相关度,并根据相关性对匹配到的文档集进行排序。(详见第5章)
图2-1
本章主要讨论Lucene基础和倒排索引的一些关键技术,比较Lucene和传统关系数据库的异同,重点剖析正排索引和倒排索引的设计。