2009-09-28 5 views
8

私はZend_Search_Luceneを使用して記事のインデックスを作成し、自分のウェブサイトでそれらを検索できるようにしています。たび管理者の更新は/作成/管理エリアの資料を削除し、インデックスが再構築されます。Zend_Search_Luceneインデックスの作成と更新

$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)のファイルをインデックスフォルダに作成するようだが、私が "作成"を使うと、そのファイルを新しい#.cfsで上書きする#がインクリメントされたファイルです(したがって、たとえば_2.cfsだけです)。これらの分割ファイルの内容を教えてください。

答えて

8

はい、文書が既に索引に含まれているかどうかを確認するには、this Manual Pageを参照してください。 $ index->​​ delete($ id);ここで$ idはtermDocsメソッドの戻り値です。その後、新しいバージョンのドキュメントを追加するだけで済みます。

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

+0

が販売されました。どうもありがとう。 – typeoneerror

関連する問題