我已經創建了一個簡單的索引,使用Zend_Search_Lucene搜索公司名稱列表,因爲我希望能夠提供比簡單的MySQL'LIKE%查詢% 」。我使用了下面的代碼,其中'companyname'是公司名稱,'document_id'是每個文檔的唯一ID(我知道Lucene在內部分配一個ID,但我知道可以更改,而我的文檔ID將會靜態)。Zend搜索Lucene不返回預期結果
$index = Zend_Search_Lucene::create('test-index');
$document = new Zend_Search_Lucene_Document();
$document->addField(Zend_Search_Lucene_Field::UnIndexed('document_id', 1));
$document->addField(Zend_Search_Lucene_Field::Text('companyname', 'XYZ Holdings'));
$index->addDocument($document);
$document = new Zend_Search_Lucene_Document();
$document->addField(Zend_Search_Lucene_Field::UnIndexed('document_id', 2));
$document->addField(Zend_Search_Lucene_Field::Text('companyname', 'X.Y.Z. (Holdings) Ltd'));
$index->addDocument($document);
$document = new Zend_Search_Lucene_Document();
$document->addField(Zend_Search_Lucene_Field::UnIndexed('document_id', 3));
$document->addField(Zend_Search_Lucene_Field::Text('companyname', 'X Y Z Ltd'));
$index->addDocument($document);
$index->commit();
然而,當我運行下面的代碼查找所有的公司在他們的名字 'XYZ' 的變種:
$index = Zend_Search_Lucene::open('test-index');
$hits = $index->find('companyname:XYZ');
foreach ($hits as $hit)
{
print "ID: " . $hit->document_id . "\n";
print "Score: " . $hit->score . "\n";
print "Company: " . $hit->companyname . "\n";
}
我結束了以下內容:
ID: 1
Score: 1
Company: XYZ Holdings
我希望XYZ能夠匹配所有的文檔,因爲要進行這種搜索的目的是爲了找到具有相同名稱但標點符號略有不同的公司,這些公司在簡單的LIKE子句中不能滿足要求。是否有一個原因,爲什麼Lucene不匹配所有的文件,有什麼我可以做的,以解決這個問題?
如果我搜索'companyname:'x.y.z持有'' - 這與'companyname:'x.y.z持有''不匹配,我會得到同樣的問題。我期望Lucene能夠解決'持有'和'持股'足夠接近被視爲匹配。
我確信所有的文件進行索引,因爲如果我搜索「XYZ」我得到的文件2和3
編輯匹配:忘了提的PHP版本(5.3.5-1ubuntu7.4與Suhosin-Patch)和Zend Framework版本(1.11.10-0ubuntu1)。
謝謝,這聽起來像其他大寫單詞幹擾Lucene沒有提供我想要的東西,因爲我認爲它會阻止你,否則我只是重新發明輪子,我可以保證我會錯過一些東西。 – pwaring 2012-01-17 09:21:48
該詞幹可作爲第三方插件使用。但是,我不認爲你所要求的適合正常的干擾規則。 Java實現有一個更大的生態系統可供選擇。 – 2012-01-17 12:56:10