第一章 初识Lucene

多看几遍,慢就是快

1.1 应对信息爆炸

1.2 Lucene 是什么

1.2.1 Lucene 能做些什么

1.2.2 Lucene 的历史

1.3 Lucene 和搜索程序组件

基本概念

索引操作

将原始数据引入可被高效查找的对照表中,以便能够对这些内容进行快速搜索。

这里的对照表的结构是什么样的?是二叉排序树还是红黑树?

索引是一个精心设计的数据结构。

1.3.1 索引组件

获取内容

如果内容是存在文件系统特定目录下的XML文档,或者是组织有序的数据库中的内容,获取内容很简单。

但是如果分散在各个地方会复杂。对于使用权限管理的系统(权限管理是指系统只允许用户访问其对应权限的文档)来说,获取内容这一步将变得更加复杂。因为这时需要用”超级用户“权限来获取内容(可能会用到黑客技术)。

内容获取模块在访问规模比较大的内容集时,或者是一天变化比较大的内容集时,以增量的方式运行,是持续运行的后台服务,能实时获取新文档信息或者内容改变文档的信息,并在能够访问时获取这些文档的内容。

Lucene作为一款核心搜索库,并不提供任何功能来实现内容获取。内容获取的实现完全依赖于你自己的应用程序或者某一款其他软件。

大量的开源爬虫软件可以实现这个功能,比如:solr,Nutch,Grub,Heritrix,Drods,aperture,谷歌企业连接管理工程

如果你的应用程序结构比较松散的话,那最好是使用已有的爬虫工具。

建立文档

将内容转换成文档,以供搜索引擎使用。文档主要包括几个带值的域,比如标题、正文、摘要、作者和链接。

内容=》文档过滤器转换处理=》文档。因为目前的文件格式大多是二进制格式的(PDF文件,Microsoft Office文件、Open Office文件、Adobe Flash文件、视频流和音频多媒体文件),或者包含一些在索引操作前必须去除的固定标记(RDF、XML、HTML)。

有时由于复杂的商业逻辑,需要创建额外的域

也可以连接某个分离的数据存储区域(例如数据库)原始内容,并将这些内容合并成一个单独的文档提供给搜索引擎。

向单个文档和域插入加权值。加权可以在进行索引操作前静态完成;也可以在搜索期间动态完成。

包括Lucene在内的几乎所有的搜索引擎都会自动地静态地对内容较短的域进行加权。这在直觉上是能说通的:如果要在一个很长的文档中匹配一两个单词,那么匹配结果一定不如在三四个单词长的文档中匹配同样的单词切题。

上面这句话可以这样理解:既然较短的文档出现了这两个单词,说明这两个单词占据了主要的语义,这两个单词在较短的文档中更加重要;相比很长的文档中出现了这两个单词,说明很长的文档中的这两个单词相对不是很重要,很有可能不是主要语义,是附带语义。

文档分析

将文本分割成一系列被称之为语汇单元的独立的原子元素。

Lucene提供了大量内嵌的分析器能让你轻松控制这步操作。 

文档索引

文档被加入到索引列表

1.3.2 搜索组件 

搜索质量主要由查准率和查全率来衡量。

搜索引擎的典型组件如下:

用户搜索界面

建立查询

搜索查询

常见的搜索理论模型有如下3种:

纯布尔模型,向量空间模型,概率模型

展现结果

1.3.3 搜索程序的其他模块

管理界面

分析界面

搜索范围

搜索范围有两种界定方式:净处理内容和净查询吞吐量

Lucene并没有提供有关搜索范围的处理模块。但是apache Lucene项目下的Solr和Nutch项目都提供了对索引拆分和复制的支持。Katta开源项目基于Lucene的,它也提供这个功能。Elastic search提供了另一个选择,它也是基于Lucene的开源项目。

1.3.4 Lucene 与应用程序的整合点

1.4 Lucene 实战:程序示例

1.4.1 建立索引

使用Indexer索引文本文件

运行Indexer

命令如下:

ant Indexer

1.4.2 搜索索引

用Searcher来实现搜索

版本号参数

运行 Searcher

命令如下:

ant Searcher

1.5 理解索引过程的核心类

1.5.1 IndexWriter

写索引

1.5.2 Directory

描述了Lucene索引的存放位置,它是一个抽象类

1.5.3 Analyzer

1.5.4 Document

1.5.5 Field

文档可能拥有不止一个同名的域。在这种情况下,域的值就按照索引操作顺序添加进去。在搜索时,所有域的文本就好像连接在一起,作为一个文本域来处理。

这个地方有疑问?难道同名的域,下一次操作不会覆盖上一次操作?

1.6 理解搜索过程的核心类

1.6.1 IndexSearcher

用于搜索由IndexWriter类创建的索引

1.6.2 Term

Term对象是搜索功能的基本单元。

Term对象包含一对字符串元素:域名和单词(或域文本值)

searcher.search(q,10)

Finds the top n hits for query.

1.6.3 Query

1.6.4 TermQuery

1.6.5 TopDocs

1.7 小结

posted @ 2014-09-15 13:18  唾手可得的树  阅读(179)  评论(0编辑  收藏  举报