搜索引擎简介

搜索引擎组成

组成

搜索程序一般由索引链及搜索组件组成。

索引链

索引链功能的实现需要按照几个独立的步骤依次完成:检索原始内容、根据原始内容来创建对应的文档、对创建的文档进行索引。

搜索组件

搜索组件用于接收用户的查询请求并返回相应结果,一般由用户接口、构建可编程查询语句的方法、查询语句执行引擎及结果展示组件组成。

索引组件

定义

索引是一种数据结构,它允许对存储在其中的单词进行快速随机访问。当需要从大量文本中快速检索文本目标时,必须首先将文本内容转换成能够进行快速搜索的格式,以建立针对文本的索引数据结构,此即为索引过程。

索引组件在逻辑上通常由四部分组成,即获取内容、建立文档、文档分析与文档索引。

获取内容

通过网络爬虫或蜘蛛程序等来搜集及界定需要索引的内容。Lucene 并不提供任何获取内容的组件,因此,需要由其它应用程序负责完成这一功能,例如著名的开源爬虫程序 Solr、Nutch、Grub 及A perture 等。

必要时,还可以自行开发相关程序以高效获取自有的特定环境中的数据。获取到的内容需要建立为小数据块,即文档(Document)。

建立文档

获取的原始内容需要转换成专用部件(文档)才能供搜索引擎使用。

一般来说,一个网页、一个 PDF 文档、一封邮件或一条日志信息可以作为一个文档。文档由带 “值(Value)” 的 “域(Field)” 组成,例如标题(Title)、正文(body)、摘要(abstract)、作者(Author)和链接(url)等。不过,二进制格式的文档处理起来要麻烦一些,例如 PDF 文件。

对于建立文档的过程来说有一个常见操作:向单个的文档和域中插入加权值,以便在搜索结果中对其进行排序。权值可在索引操作前静态生成,也可在搜索期间才动态生成。权值决定了其搜索相关度。

文档分析

搜索引擎不能直接对文本进行索引,确切地说,必须首先将文本分割成一系列被称为语汇单元(token)的独立原子元素,此过程即为文档分析。

每个 token 大致能与自然语言中的 “单词” 对应起来,文档分析就是用于确定文档中的文本域如何分割成 token 序列。此即为切词,或分词。

文档分析中要解决的问题包括如何处理连接一体的各个单词、是否需要语法修正(例如原始内容存在错别字)、是否需要向原始 token 中插入同义词、是否需要将大写字符统一转换为小写字符,以及是否将单数和复数格式的单词合并成同一个 token 等。

这通常需要词干分析器等来完成此类工作,Lucene 提供了大量内嵌的分析器,也支持用户自定义分析器,甚至联合 Lucene 的 token 工具和过滤器创建自定义的分析链。

文档索引

在索引步骤中,文档将被加入到索引列表。事实上,Lucene 为此仅提供了一个非常简单的 API,而后自行内生地完成了此步骤的所有功能。

搜索组件

定义

索引处理就是从索引中查找单词,从而找到包含该单词的文档的过程。搜索质量主要由查准率(Precision)和查全率(Recall)两个指标进行衡量。查准率用来衡量搜索系列过滤非相关文档的能力,而查全率用来衡量搜索系统查找相关文档的能力。

另外,除了快速搜索大量文本和搜索速度之后,搜索过程还涉及到了许多其它问题,例如单项查询、多项查询、短语查询、通配符查询、结果 ranking 和排序,以及友好的查询输入方式等。这些问题的解决,通常需要多个组件协作完成。

用户搜索界面

UI(User Interface) 是搜索引擎的重要组成部分,用户通过搜索引擎界面进行搜索交互时,他们会提交一个搜索请求,该请求需要先转换成合适的查询对象格式,以便搜索引擎能执行查询。

建立查询

用户提交的搜索请求通常以 HTML 表单或 Ajax 请求的形式由浏览器提交到搜索引擎服务器,因此,需要事先由查询解析器一类的组件将这个请求转换成搜索引擎使用的查询对象格式。

搜索查询

当查询请求建立完成后,就需要查询检索索引并返回与查询语句匹配的并根据请求排好序的文档。搜索查询组件有着复杂的工作机制,它们通常根据搜索理论模型执行查询操作。

常见的搜索理论模型有纯布尔模型、向量空间模型及概率模型三种。Lucene 采用了向量空间模型和纯布尔模型。

展现结果

查询获得匹配查询语句并排好序的文档结果集后,需要用直观、经济的方式为用户展现结果。UI 也需要为后续的搜索或操作提供清晰的向导,如完善搜索结果、寻找与匹配结果相似的文档、进入下一页面等。

搜索引擎教程总结

搜索程序一般由索引链及搜索组件组成。