我已经创建了一个简单的索引,使用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