Zend_Lucene入门
Zend_Lucene是PHP5中Lucene搜索引擎的实现,并作为1.6版的ZendFramework的一部分包含在内。Lucene实现了所有标准搜索引擎查询语法(例如boolean和通配符搜索),并将其索引存储为文件,因此不需要数据库服务器即可运行。如果您想向网站添加搜索功能,但又不想从头开始构建查询语法,则可以使用Lucene。
要开始使用Lucene,您需要创建一个索引。以下代码具有在服务器上创建目录的作用,Lucene将使用该目录来存储和检索文档。
$index=Zend_Search_Lucene::create('/data/my-index');
要打开索引,请使用以下代码。
$index=Zend_Search_Lucene::open('/data/my-index');
当然,索引将不包含任何内容,因此下一步是向其中添加一些文档。
要创建一个新文档,您需要创建一个新文档对象。这是使用Zend_Search_Lucene_Document()类完成的。
$doc=newZend_Search_Lucene_Document();
然后,您可以使用Zend_Search_Lucene_Field类的静态函数将字段分配给该文档。
$doc->addField(Zend_Search_Lucene_Field::Text('title', 'The title of the document')); $doc->addField(Zend_Search_Lucene_Field::Text('contents', 'The contents of the document.'));
您也可以使用二进制数据,尽管它不可搜索,但仍保存在索引中。因此,可以将缩略图数据添加到您的文档中。
$doc->addField(Zend_Search_Lucene_Field::Binary('originalfile',$filedata));
这样分配的任何二进制数据都不会标记或索引,但会存储在索引中,因此您需要分配其他字段,以便可以搜索数据。
一旦添加了字段,就可以使用addDocument()索引打开的索引对象的功能来添加文档。
$index->addDocument($doc);
如果要为站点建立搜索索引,则可能要使用内置的HTML解析功能。这使您很容易添加HTML字符串或HTML文件名,然后Lucene将对其进行索引。然后,使用addDocument()打开的索引对象的功能将此文件添加到索引中。请注意,以这种方式添加文档时,还应该将文档的URL添加为字段,以便以后检索。
$doc = Zend_Search_Lucene_Document_Html::loadHTMLFile('http://www.nhooo.com/'); $doc->addField(Zend_Search_Lucene_Field::Text('url','http://www. nhooo.com/')); $index->addDocument($doc);
您还可以使用与索引,搜索Word,Excel和Powerpoint文档几乎相同的方式来对其进行索引和搜索。
有了索引后,就可以搜索它。这是使用打开的索引对象完成的,可以通过使用count()和numDocs()函数来找出索引的大小以及索引中包含的文档数量。
$indexSize = $index->count(); $documents = $index->numDocs();
要构造查询并实现布尔和通配符搜索,您需要使用Zend_Search_Lucene_Search_QueryParser类,然后使用该addSubquery()函数将该类传递给Zend_Search_Lucene_Search_Query_Boolean对象。
$queryStr = 'hash'; $userQuery = Zend_Search_Lucene_Search_QueryParser::parse($queryStr); $query = new Zend_Search_Lucene_Search_Query_Boolean(); $query->addSubquery($userQuery, true); //进行搜索 $hits = $index->find($query);
变量$hits现在包含Zend_Search_Lucene_Search_QueryHit对象的数组。该对象具有一个称为score的属性,它是命中结果的分数。分数表示查询与索引的匹配程度(0到1之间)。$hits数组中的第一项将具有最高得分值。您在索引编制时为文档定义的每个字段现在都显示为该对象的属性。因此,如果您为文档设置URL字段,则可以使用以下代码查看文档列表:
$hits = $index->find($query); foreach ($hits as $hit) { echo $hit->score.'
'; echo $hit->url.'
'; }
Lucene可以做的事情远不止我在此简要介绍的内容,因此将来我可能会写一些关于如何优化更新,索引和搜索的文章。