Я создал простой индекс, используя Zend_Search_Lucene для поиска по списку названий компаний, так как я хочу иметь возможность предложить более интеллектуальный поиск, чем простой MySQL «LIKE% query%». Я использовал приведенный ниже код, где «companyname» - это название компании, а «document_id» - уникальный идентификатор для каждого документа (я знаю, что 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 holding"' - это не соответствует ничего, кроме 'companyname: "x.y.z holdings"'. Я ожидаю, что Lucene определит, что «владение» и «владение» достаточно близко, чтобы считаться совпадением.
Я вполне уверен, что все документы проиндексированы, потому что, если я ищу 'X.Y.Z', я получаю совпадения для документов 2 и 3.
Редактировать: Забыл упомянуть версию PHP (5.3.5-1ubuntu7.4 с Suhosin-Patch) и версию Zend Framework (1.11.10-0ubuntu1).