単純なMySQLのLIKE%クエリよりもインテリジェントな検索を提供できるように、私はZend_Search_Luceneを使って単純なインデックスを作成しました。 '私は以下のコードを使用しました。ここで、 'companyname'は会社名で、 'document_id'は各ドキュメントの一意のIDです(Luceneは内部的に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' の亜種で、すべての企業を見つけるために、次のコードを実行すると:
ID: 1
Score: 1
Company: XYZ Holdings
:私は次のように終わる
$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";
}
私はXYZがすべての文書に一致することを期待していました。この検索の要点は、同じ名前でわずかに異なる句読点を持つ企業を選ぶことです。単純なLIKE句でそれを処理することはできません。 Luceneがすべての文書に一致しない理由はありますか?これを解決するためにできることはありますか?
'companyname: "x.y.z holding"を検索すると、同じ種類の問題が発生します。これは' companyname:x.y.z holdings 'と一致しません。私は、Luceneが、「保有」と「保有」が十分に近いと考えて、マッチとみなすことを期待しています。私は「XYZ」を検索すると、私はすべての文書がインデックス化されているかなり確信している
はので、私は、文書2及び3
編集のためのマッチを取得する:PHPのバージョン(5.3.5-1ubuntu7.4に言及し忘れましたSuhosin-Patch)とZend Frameworkバージョン(1.11.10-0ubuntu1)を使用しています。
おかげで、それはのように聞こえるの頭字語ではない他の大文字の単語と干渉する可能性がありますLuceneは私がそれを望むものを提供していません。それ以外の場合は、私はそれを改革しています。私は何かが欠けていることを保証することができます。 – pwaring
ステミングはサードパーティのプラグインとして利用できます。しかし、私はあなたには、とにかく通常の種付けルールに適合するように求めるものはないと思います。 Javaの実装には、より大きなエコシステムが選択できます。 –