第 14 章 Zend_Search
上一页 |  | 下一页

## 第 14 章 Zend_Search

## 14.1. 概述

### 14.1.1. 简介

Zend_Search_Lucene 是一个完全由 PHP 5 编写的通用文本搜索引擎。由于其将索引保存在文件系统中而不需要数据库支持，因此它几乎可以为任何由 PHP 驱动的网站增加搜索能力。Zend_Search_Lucene 支持下列特性：

- 具有排名功能的搜索——最符合要求的结果出现在最前面

- 许多强大的查询类型：短语查询、通配符查询、近似查询、范围查询等 [5]

- 搜索特定的字段，如标题、作者、内容，等等

Zend_Search_Lucene 来源于 Apache Lucene project。要了解关于 Lucene 的更多详情，请访问 http://lucene.apache.org/java/docs/。

### 14.1.2. 文档和字段对象

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”的字段缺省的用于搜索。因此，将主要的文档内容放在这个字段中会是个好主意。

### 14.1.3. 理解字段类型

- `Keyword` 关键词字段是被保存和被索引的，意思是它们既可以被搜索，也可以在搜索结果中被显示。它们并没有以记号化的方式拆分为多个不同的词。在 Zend_Search_Lucene 中，枚举形的数据库字段通常可以很好的转化为关键词字段。

- `UnIndexed` 不索引字段是不可搜索的，但是它们会在搜索结果中返回用于生成点击信息。数据库的时间戳、主键、文件系统的路径、以及其它标识是不索引字段的好的候选人。

- `Binary` 二进制字段是不记号化和不被索引的，但是被保存以供生成点击信息。它们可以用于保存任何以二进制方式编码的信息，例如图标等等。

- `Text` 文本字段是被保存的、被索引的和记号化的。文本字段适合用于保存像是主题、标题这样既能被搜索又能作为搜索结果返回的信息。

- `UnStored` 不保存字段是记号化和被索引的，但并不保存在索引中。大量的文本信息最好使用这种字段类型。保存的数据在硬盘上创建了大量的索引，如果你需要搜索而不需要在搜索结果中显示这些数据，就使用不保存字段。当结合使用 Zend_Search_Lucene 索引和关系数据库时最适合使用不保存字段。你通过不保存字段索引大量数据用于搜索，并通过作为标识的特定字段从你的关系数据库中获取它们。

  表 14.1. Zend_Search_Lucene_Field 类型

  字段类型 | 保存 | 索引 | 记号化 | 二进制
  --- | --- | --- | --- | ---
  Keyword | 是 | 是 | 否 | 否
  UnIndexed | 是 | 否 | 否 | 否
  Binary | 是 | 否 | 否 | 是
  Text | 是 | 是 | 是 | 否
  UnStored | 否 | 是 | 是 | 否

[5] 目前只支持单项和多项查询。

上一页 |  | 下一页
13.6. Zend_Pdf module usage example. | 起始页 | 14.2. 建立索引