Zend_Search_Lucene 是一个完全由 PHP 5 编写的通用文本搜索引擎。由于其将索引保存在文件系统中而不需要数据库支持,因此它几乎可以为任何由 PHP 驱动的网站增加搜索能力。Zend_Search_Lucene 支持下列特性:
具有排名功能的搜索——最符合要求的结果出现在最前面
许多强大的查询类型:短语查询、通配符查询、近似查询、范围查询等 [5]
搜索特定的字段,如标题、作者、内容,等等
Zend_Search_Lucene 来源于 Apache Lucene project。要了解关于 Lucene 的更多详情,请访问 http://lucene.apache.org/java/docs/。
Zend_Search_Lucene 把文档最为基本的索引主题。而文档(document)又分为若干被命名的字段(field),字段中包含可供搜索的内容。
一个文档被表现为 Zend_Search_Lucene_Document 对象,这个对象包含了若干 Zend_Search_Lucene_Field 对象,用以表现相应的字段。
需要特别说明的是任意类型的信息都可以被加入索引中。应用程序描述信息或者元信息(metadata)可以被保存在文档字段中,并在搜索过程中与文档一起被检索。
控制这些索引是你的应用程序的责任。这意味着任意你的应用程序可以访问的数据来源都可以进行索引。例如,这些数据可以来自于文件系统、数据库或者是 HTML 表单,等等。
Zend_Search_Lucene_Field
类提供了一些静态方法用以创建具有不同特点的字段:
<?php $doc = new Zend_Search_Lucene_Document(); // Field is not tokenized, but is indexed and stored within the index. // Stored fields can be retrived from the index. $doc->addField(Zend_Search_Lucene_Field::Keyword('doctype', 'autogenerated')); // Field is not tokenized nor indexed, but is stored in the index. $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created', time())); // Binary String valued Field that is not tokenized nor indexed, // but is stored in the index. $doc->addField(Zend_Search_Lucene_Field::Binary('icon', $iconData)); // Field is tokenized and indexed, and is stored in the index. $doc->addField(Zend_Search_Lucene_Field::Text('annotation', 'Document annotation text')); // Field is tokenized and indexed, but that is not stored in the index. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', 'My document content')); ?>
你可以按照自己的需要给字段命名。名为“contents”的字段缺省的用于搜索。因此,将主要的文档内容放在这个字段中会是个好主意。
Keyword
关键词字段是被保存和被索引的,意思是它们既可以被搜索,也可以在搜索结果中被显示。它们并没有以记号化的方式拆分为多个不同的词。在 Zend_Search_Lucene 中,枚举形的数据库字段通常可以很好的转化为关键词字段。
UnIndexed
不索引字段是不可搜索的,但是它们会在搜索结果中返回用于生成点击信息。数据库的时间戳、主键、文件系统的路径、以及其它标识是不索引字段的好的候选人。
Binary
二进制字段是不记号化和不被索引的,但是被保存以供生成点击信息。它们可以用于保存任何以二进制方式编码的信息,例如图标等等。
Text
文本字段是被保存的、被索引的和记号化的。文本字段适合用于保存像是主题、标题这样既能被搜索又能作为搜索结果返回的信息。
UnStored
不保存字段是记号化和被索引的,但并不保存在索引中。大量的文本信息最好使用这种字段类型。保存的数据在硬盘上创建了大量的索引,如果你需要搜索而不需要在搜索结果中显示这些数据,就使用不保存字段。当结合使用 Zend_Search_Lucene 索引和关系数据库时最适合使用不保存字段。你通过不保存字段索引大量数据用于搜索,并通过作为标识的特定字段从你的关系数据库中获取它们。