8

Zend_Search_Luceneを使用して記事のインデックスを作成し、自分のWebサイトで記事を検索できるようにしています。管理者が管理領域の記事を更新/作成/削除するたびに、インデックスが再構築されます。

$config = Zend_Registry::get("config");
$cache = $config->lucene->cache;
$path = $cache . "/articles";

try
{
    $index = Zend_Search_Lucene::open($path);
}
catch (Zend_Search_Lucene_Exception $e)
{
    $index = Zend_Search_Lucene::create($path);
}

$model = new Default_Model_Articles();
$select = $model->select();
$articles = $model->fetchAll($select);

foreach ($articles as $article)
{
    $doc = new Zend_Search_Lucene_Document();
    $doc->addField(Zend_Search_Lucene_Field::Text("title", $article->title));
    $index->addDocument($doc);
}

$index->commit();

私の質問はこれです。記事のインデックスを再作成し、削除された記事も処理しているので、(「開いて更新」する代わりに)毎回「作成」を使用しないのはなぜですか?上記の方法を使用すると、記事は毎回addDocumentで追加されると思います(したがって、重複があります)。どうすればそれを防ぐことができますか?ドキュメントがすでにインデックスに存在するかどうかを確認する方法はありますか?

また、「開いて」更新したときにインデックスがどのように機能するかを完全には理解していないと思います。インデックスフォルダに毎回新しい#.cfs(つまり、_0.cfs、_1.cfs、_2.cfs)ファイルが作成されるようですが、「create」を使用すると、そのファイルが新しい#.cfsで上書きされます。 #がインクリメントされたファイル(たとえば、単に_2.cfs)。これらのセグメント化されたファイルとは何か説明していただけますか?

4

1 に答える 1

8

はい、ドキュメントがすでにインデックスに含まれているかどうかを確認できます。このマニュアルページをご覧ください。次に、$ index->​​ delete($ id);を使用して、この特定のドキュメントをインデックスから削除できます。ここで、$idはtermDocsメソッドの戻り値です。その後、ドキュメントの新しいバージョンを追加するだけです。

Luceneが作成する複数のインデックスファイルについて:既存のインデックスを変更するたびに、Luceneは実際には既存のファイルを変更しませんが、変更を加えるたびに部分インデックスを追加します。これはパフォーマンスに非常に悪いですが、これを回避する簡単な方法があります。インデックスに変更を加えるたびに、次のようにします。$ index->​​optimize(); -これにより、すべての部分ファイルが実際のインデックスに追加され、検索時間が大幅に改善されます。

于 2009-09-29T09:21:03.500 に答える