您的位置:首页 > 编程语言 > PHP开发

Zend_Search_Lucene创建PHP站内搜索

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

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

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

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

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


首先创建建立索引文件,如下示例:

index.php

<?php
require_once 'Zend/Search/lucene.php'; require_once 'CN_Lucene_Analyzer.php'; Zend_Search_Lucene_Analysis_Analyzer::setDefault(new CN_Lucene_Analyzer()); $index = new Zend_Search_Lucene('index1', true); $doc = new Zend_Search_Lucene_Document(); $doc->addField(Zend_Search_Lucene_Field::Text('url', 'http://www.eyuwo.com', 'UTF-8')); $Text='this is just a test of Zend_Search_lucene. 说些什么呢,别没事找事啊,真不够哥们,繁體能不能被搜索到呢,测试一下啊.'; $Text.='非常簡單的實作;然而就全文檢索來說還是有缺點的!首先,建立分詞索引時必定會耗費系統資源,故比較好的做法是批次定時處理建立索引的動作。第二點是中文的問題,因為中文字詞與連貫的句子的關係,在分詞時是以二個字為一個詞的最基本單位,所以單一個中文字是不會有任何搜尋結果的。最後因為建立分詞索引為觸發事件,如果沒有去觸發它就無法更新分詞至目前資料庫的最新狀態。我覺得分詞索引的方式很像是MySQL的View資料表,也是將資料表中的欄位作一個資料上的更新,只是它沒有欄位的限制,可以針對建立的「詞」索引進行搜尋。就某方面來說是很好用的功能,也不失為中文在全文索引時的一種解決方案。^^'; //$docText=iconv('ISO-8859-1','ASCII//TRANSLIT',$Text); $doc->addField(Zend_Search_Lucene_Field::Text('contents', $Text ,'UTF-8')); $index->addDocument($doc); $index->commit(); echo 'indexer one file!';
?>


2、运行index.php后,成功创建索引文件,可在当前目录下看到“index1”文件夹

<?php
require_once 'Zend/Search/lucene.php';
require_once 'CN_Lucene_Analyzer.php';
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new CN_Lucene_Analyzer());
$index = new Zend_Search_Lucene('index1', true);
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Text('url', 'http://www.eyuwo.com', 'UTF-8'));
$Text='this is just a test of Zend_Search_lucene. 说些什么呢,别没事找事啊,真不够哥们,繁體能不能被搜索到呢,测试一下啊.';
$Text.='非常簡單的實作;然而就全文檢索來說還是有缺點的!首先,建立分詞索引時必定會耗費系統資源,故比較好的做法是批次定時處理建立索引的動作。第二點是中文的問題,因為中文字詞與連貫的句子的關係,在分詞時是以二個字為一個詞的最基本單位,所以單一個中文字是不會有任何搜尋結果的。最後因為建立分詞索引為觸發事件,如果沒有去觸發它就無法更新分詞至目前資料庫的最新狀態。我覺得分詞索引的方式很像是MySQL的View資料表,也是將資料表中的欄位作一個資料上的更新,只是它沒有欄位的限制,可以針對建立的「詞」索引進行搜尋。就某方面來說是很好用的功能,也不失為中文在全文索引時的一種解決方案。^^';
//$docText=iconv('ISO-8859-1','ASCII//TRANSLIT',$Text);
$doc->addField(Zend_Search_Lucene_Field::Text('contents', $Text ,'UTF-8'));
$index->addDocument($doc);
$index->commit();
echo 'indexer one file!';
?>


3、关键字搜索

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php
require_once('Zend/Search/Lucene.php');
require_once('CN_Lucene_Analyzer.php');
$index = new Zend_Search_Lucene('index1');
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new CN_Lucene_Analyzer());
$query = Zend_Search_Lucene_Search_QueryParser::parse($keyword, "UTF-8");
$hits = $index->find($query);
foreach ($hits as $hit) {
echo 'ID: '.$hit->id.'<br>';
echo 'Score: '.$hit->score.'<br>';
echo 'Url: '.$hit->url.'<br><hr>';
echo 'Contents: '.$hit->contents.'<br>';
}
?>
<hr>
<form action="" name="frm" method="get" onSubmit="return checkform(this)">
<input type="text" name="keyword" size="20" maxlength="50" value="<?=$keyword?>">
<input type="submit" name="search" value="搜索">
</form>


4、简易的zend lucene搜索就这样完成了,更多功能请参考zend手册,但是目前来讲zend版的lucene建立索引和搜索都是速度太慢,无法满足系统需求,转而使用sphinx,这个将在下文介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: