第 41 章 Zend_Search_Lucene

目录

41.1. 概述
41.1.1. 简介
41.1.2. 文档和字段对象
41.1.3. 理解字段类型
41.2. 建立索引
41.2.1. 创建新索引
41.2.2. 更新索引
41.3. 搜索索引
41.3.1. 建立查询
41.3.2. 搜索结果
41.3.3. 结果评分
41.4. Query Language
41.4.1. Terms
41.4.2. Fields
41.4.3. Wildcards
41.4.4. Term Modifiers
41.4.5. Range Searches
41.4.6. Fuzzy Searches
41.4.7. Proximity Searches
41.4.8. Boosting a Term
41.4.9. Boolean Operators
41.4.9.1. AND
41.4.9.2. OR
41.4.9.3. NOT
41.4.9.4. &&, ||, and ! operators
41.4.9.5. +
41.4.9.6. -
41.4.9.7. No Operator
41.4.10. Grouping
41.4.11. Field Grouping
41.4.12. Escaping Special Characters
41.5. 查询类型
41.5.1. 单项查询
41.5.2. 多项查询
41.5.3. 短语查询
41.6. 字符集
41.6.1. UTF-8 和单字节字符集支持
41.7. 扩展性
41.7.1. 文本分析
41.7.2. 评分算法
41.7.3. 存储容器
41.8. 与 Java Lucene 的互操作性
41.8.1. 文件格式
41.8.2. 索引目录
41.8.3. Java 源代码
41.9. Advanced
41.9.1. Starting from 1.6, handling index format transformations.
41.9.2. Using the index as static property
41.10. Best Practices
41.10.1. Field names
41.10.2. Indexing performance
41.10.3. Index during Shut Down
41.10.4. Retrieving documents by unique id
41.10.5. Memory Usage
41.10.6. Encoding
41.10.7. Index maintenance

41.1. 概述

41.1.1. 简介

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

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

  • 许多强大的查询类型:短语查询、通配符查询、近似查询、范围查询等 [6]

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

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

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

41.1.3. 理解字段类型

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

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

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

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

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

    表 41.1. Zend_Search_Lucene_Field 类型

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



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