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)。これらのセグメント化されたファイルとは何か説明していただけますか?