• / 27
  • 下载费用:10 金币  

第23章 文本搜索引擎(Zend_Search_Lucene).ppt

关 键 词:
第23章 文本搜索引擎(Zend_Search_Lucene).ppt
资源描述:
第23章 文本搜索引擎(Zend_Search_Lucene),通常的网站系统中,全站搜索是一个非常实用又十分便捷的功能。用户可以使用此功能在最短的时间内找出自己所需要的信息。通常的全站搜索功能都是需要数据库后台支持的,因为这样可以使用SQL语句强大的查询功能,而同样的文本搜索引擎则相对较少。本章所要介绍的Zend_Search_Lucene就是Zend Framework所提供的基于文本的通用搜索引擎。通过本章内容的学习,读者可以领会到使用Search_Lucene文本搜索引擎所带来的惊喜。,23.1 Zend_Search_Lucene简介,本节先来介绍关于Zend_Search_Lucene的一些基础内容,其中包括Zend_Search_Lucene的特点、Zend_Search_Lucene的组成部分以及字段类型的含义等。,23.1.1 Zend_Search_Lucene的特点,Zend_Search_Lucene是一个完全由PHP5编写的通用文本搜索引擎。由于其将索引保存在文件系统中而不需要数据库支持,因此该组件几乎可以为任何由PHP驱动的网站提供搜索能力。Zend_Search_Lucene组件具有以下特点。 具有排名功能的搜索,搜索结果中最符合要求的内容将出现在结果集的最前面。 支持许多强大的查询类型,如短语查询、通配符查询、近似查询、范围查询等。 支持对特定字段的搜索,如标题、作者、内容、发表时间等。,23.1.2 Zend_Search_Lucene的组成,Zend_Search_Lucene将文档作为基本的索引主题,而文档(document)又可以分为若干被命名的字段(field),字段中包含可供搜索的内容。一个文档被表现为Zend_Search_Lucene_Document对象,这个对象包含了若干Zend_Search_Lucene_Field对象,用以表现相应的字段。 需要特别说明的是索引中可以加入任意类型的信息。应用程序描述信息或者元信息(metadata)可以被保存在文档字段中,并在搜索过程中与文档一起被检索。控制这些索引是应用程序的责任。这意味着任意应用程序可以访问的数据来源都可以进行索引。例如,这些数据可以来自于文件系统、数据库或者是HTML表单等。,23.1.3 字段的含义,Zend_Search_Lucene_Field字段类中的字段中每种的创建方法与特点都不同。而类也提供了一些静态方法用以创建具有不同特点的字段。 Zend_Search_Lucene_Field::Keyword($name,$value,$encoding='') Zend_Search_Lucene_Field::UnIndexed($name,$value,$encoding='') Zend_Search_Lucene_Field::Binary($name,$value) Zend_Search_Lucene_Field::Text($name,$value,$encoding='')Zend_Search_Lucene_Field::UnStored($name,$value,$encoding=''),23.2 创建索引,索引(Index)是Zend_Search_Lucene的重要组成部分。本节介绍如何创建并使用索引。其中将详细介绍创建一个新的索引与更新已经存在的索引的方法。,23.2.1 创建新的索引,要创建Zend_Search_Lucene索引,可以使用Zend_Search_Lucene的构造函数。 __construct($directory = null, $create = false),23.2.3 索引的常用方法,Zend_Search_Lucene提供了许多有用的方法用于获取索引对象的相关信息并对其进行操作。本小节来介绍常用的索引对象的方法,合理使用这些方法会有助于用户对索引对象进行更符合实际情况的操作。 1.获取索引的路径 2.获取文档的数目 3.设置与获取默认搜索字段 4.获取所有字段名称,上一节介绍了如何创建索引及索引对象的常用方法,本节继续来介绍如何对索引进行搜索。本节内容将按照对索引进行搜索的三个步骤,即建立查询、搜索结果以及结果评分来分别作介绍。,23.3.1 建立查询,使用过数据库搜索的读者都知道,要对数据库进行搜索,关键是要创建相应的SQL语句。而要对Zend_Search_Lucene索引执行搜索,也需要相应的 查询(Query)。有两种方法可以在索引中进行搜索,第一种方法是使用查询分析程序(Query Parser)来从字符串中创建查询;第二种方法是通过Zend_Search_Lucene提供自己创建的API进行查询。,23.3.2 搜索的结果,Zend_Search_Lucene_Search_QueryHit对象还可以将Zend_Search_Lucene_Document中的各个字段作为属性陈列出来。如在代码23-8.php中,结果集就有id、score与title等几个属性。 索引中原始的Zend_Search_Lucene_Document对象可以从Zend_Search_Lucene_Search_QueryHit结果中获得。可以使用索引对象的getDocument()方法来获取文档进行索引的部分,并且还可以使用getFieldValue()方法来获取指定字段的值。代码23-8.php,就使用了这种方法。 能够获取的Zend_Search_Lucene_Document对象的字段是在进行索引的时候决定的。由索引创建程序在文档中建立的文档字段要么是被索引的,要么是被索引并保存的。,23.3.3 结果的Score,对指定索引进行搜索,所搜索的结果Zend_Search_Lucene_Search_QueryHit中会包括Score属性。该属性即搜索结果的分值。Zend_Search_Lucene使用和Java Lucene一样的评分算法。搜索结果是按照分值进行排序的。分值越大,相应的搜索结果就越靠前。不同的分值意味着一篇文档相比另一篇更能匹配查询要求。 评分的标准粗略地说,如果文档字段中包含更多的搜索项或短语的搜索结果,则将会具有更高的分值。搜索结果的分值可以通过score属性进行获取。,23.4 查询语句语法,上一节所介绍的对索引进行搜索的实例中,使用了最简单的Query查询语句(使用基本的字符串匹配)。实际上Zend_Search_Lucene中的Query查询支持很多的操作符,这些众多的操作符组成了一个完成的语言体系。本节就介绍查询语句的语法。,23.4.1 Query的项,在Zend_Search_Lucene中,一个Query语句被分成项与操作两部分。其中的项包括三种,分别是单独项、短语项和子查询项。 单独项为一个单个的字符串(不包括空格)。如“test”或者“hello”等。 短语项是一个字符串的组合(可以包括空格)。如“hello world”等。 子查询项是一个被半角括号包括起来的短语项。如“(hello dolly)”等。,23.4.2 查询字段,如果要对指定字段内容进行搜索,可以使用字段名后加“:”(冒号)加搜索项的方法进行。如以下代码就设定在字段title中进行搜索。 title:'title' title:this is right title:'this is right',23.4.3 布尔操作符,Zend_Search_Lucene也支持在查询语句中使用布尔操作符,以给查询提供更多的条件。这些布尔操作符包括“AND”(逻辑与)、“+”(加号)、“OR”(逻辑或)、“NOT”(逻辑非)以及“-”(减号)五种。下面将就这五种操作符分别作介绍。 1.AND操作符 2.OR操作符 3.NOT操作符 4.+操作符 5.-操作符,23.4.4 特殊字符的过滤,在Zend_Search_Lucene中的特殊字符,是用于操作的“+”、“-” 、“&&”、“||”、“!”、“()”、“{}”、“[]”、“^”、““”、“~”、“*”、“?”、“:”以及“\”等。如果被搜索的字符串中包括这样的字符,那么定义Query语句时,需要对这些字符进行转义。与PHP一样,使用“\”即可。所以,要搜索(1+1):2这个字符串,就需要使用如下代码样式。 \(1\+1\)\:2 使用这样的代码样式即可实现对特殊字符的过滤。,23.5 查询类型,本节来介绍Zend_Search_Lucene的查询类型。Lucene支持的查询类型有单项查询、多项查询和短语查询三种。下面将分别就这三种查询类型为读者作详细的介绍。,23.5.1 单项查询,单项查询是指用于搜索一个搜索项的查询,这种查询也是最简单的查询类型。两种搜索方式都可以用于单项查询。 1.使用查询字串的方式进行单项查询。 2.通过API创建查询。,23.5.2 多项查询,多项查询是指用于搜索一组搜索项的查询,这种查询是以最简单的单项查询为基础的查询类型。其中被搜索的每一项可以被定义为必须的、禁止的或者既不必须也不禁止(可选)的几种。 必须的意思是文档如果不匹配这个搜索项,那么它就不匹配整个查询; 禁止的意思是文档如果匹配这个搜索项,那么它就不匹配整个查询;,23.5.3 短语查询,短语查询是一种用于搜索短语的查询。短语查询相比前两种查询较为复杂,但其非常灵活,既可以搜索精确的短语,也可以搜索模糊的短语。精确短语可以包含搜索项和空隙(空隙就是支持形如“word1 . word2”的短语。可以使用程序生成以用于不同的用途)。此外,搜索项可以被复制以提升该搜索项的权重或者一些同义词可以放在相同的地方。因此目前短语查询只能通过API创建。,23.6 Lucene字符集,经过前面的介绍,可能有的读者已经决定使用该组件构建文本全站搜索系统了。但是,需要注意的是,Zend_Search_Lucene被设计于工作在UTF-8字符集下。索引文件在Java的“modified UTF-8 encoding”编码下保存文件。Zend_Search_Lucene 只支持基本多语言平面(Basic Multilingual Plane,BMP)字符集(从0x0000到0xFFFF),不支持辅助字符集(supplementary characters)那些代码指针大于0xFFFF的字符。所以要想使用中文还是需要经过一些额外工作的(没办法,这些东西都是老外搞的)。,23.7 扩展Lucene,Zend_Search_Lucene类是可以扩展的,所以用户可以使用自定义的搜索规则。其中主要有三部分组成,分别是文本分析(Zend_Search_Lucene_Analysis_Analyzer)、评分算法(Zend_Search_Lucene_Search_Similarity)和存储容器(Zend_Search_Lucene_Storage_Directory)三部分。本节将介绍如何分别实现就这三种扩展。,23.7.1 文本分析,Zend_Search_Lucene_Analysis_Analyzer类被索引建立程序用于记号化文档的文本字段。使用Zend_Search_Lucene_Analysis_Analyzer类的静态方法getDefault()可以获取当前的默认分析程序。而通过Zend_Search_Lucene_Analysis_Analyzer::setDefault()方法则可以设置默认的分析程序。,,23.7.2 评分算法,在Zend_Search_Lucene中,评分采用这样的算法,查询q在文档d中的分值score定义如下。 score(q,d)=sum(tf(t in d)*idf(t)*getBoost(t.field in d)*lengthNorm(t.field in d))*coord(q,d)*queryNorm(q),23.7.3 存储容器,Zend_Search_Lucene_Storage_Directory_Filesystem类实现了针对文件系统的目录功能。可以通过扩展Zend_Search_Lucene_Storage_Directory类定义自己的目录实现。Zend_Search_Lucene_Storage_Directory类包括以下方法。 abstract function close(); abstract function createFile($filename); abstract function deleteFile($filename); abstract function fileExists($filename); abstract function fileLength($filename); abstract function fileModified($filename); abstract function renameFile($from, $to); abstract function touchFile($filename); abstract function getFileObject($filename);,23.8 小结,本章介绍了Zend Framework中的Zend_Search_Lucene组件。使用该组件可以创建基于文本的全文搜索引擎。由于该组件正处于发展期,所以其效率及功能还有待进一步提高,可能在后续版本中会得到加强。另外,该组件并不能直接支持中文,所以想要使用此组件进行全中文的搜索,还需要使用自定义分词程序及其他相关内容来实现。,
展开阅读全文
  微传网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:第23章 文本搜索引擎(Zend_Search_Lucene).ppt
链接地址:https://www.weizhuannet.com/p-10036009.html
微传网是一个办公文档、学习资料下载的在线文档分享平台!

网站资源均来自网络,如有侵权,请联系客服删除!

 网站客服QQ:80879498  会员QQ群:727456886

copyright@ 2018-2028 微传网络工作室版权所有

     经营许可证编号:冀ICP备18006529号-1 ,公安局备案号:13028102000124

收起
展开