2011-01-29 21 views
0

実際にインデックスを作成して最適化する方法は、毎回レコードのチャンクを作成して最適化し、すべてを1つに変換しないことです。今私が直面している問題は、私は重複したドキュメント/レコードをインデックスに作成することです。インデックスから重複を削除するための関数やコードがあるかどうかを知る必要があります。ありがとうございます。 Zend luceneインデックスから重複したドキュメントを削除する

答えて

0

固有の識別子である用語が必要です。次に、索引に文書を追加する前に、索引を削除します。

重複は、同じ一意のIDを持つ複数のドキュメントを持つ単なるインスタンスです。だから、一意のIDフィールドのすべての用語を列挙し、2つの結果を持つものを検索するだけです。私が知る限りこれを行うための組み込みメソッドはありません。

2

更新する前にレコードを削除する必要があります。これはLuceneの仕事です。既存のレコードを更新することはできません。

が、これはあなたが今、あなたは基本的に挿入:)で更新を行うことができます記録

$index = Zend_Search_Lucene::open('data/index');//'data/index' is the file that lucene generated 
$query = new Zend_Search_Lucene_Search_Query_Term(new 
Zend_Search_Lucene_Index_Term($listing_id, 'listing_id'));// 'listing_id' is a field i added when creating index for the first time. $listing_id is the id value of the row i want to delete 
$hits = $index->find($query); 
foreach ($hits as $hit) { 
    $index->delete($hit->id);// $hit->id is not listing_id, it's lucene unique index of the row that has listing_id = $listing_id 
} 

を削除する方法です、それは仕方のLuceneの作品です。

0

新しいデータを追加する前に、コミット$index->commit()を忘れないでください。それが私の複製データが$index->find($query)に戻る理由です。

$index = Zend_Search_Lucene::open('/lucene/index'); 
$query = new Zend_Search_Lucene_Search_Query_Term (new Zend_Search_Lucene_Index_Term($id, 'key')); 

$hits = $index->find($query); 
foreach ($hits as $hit) { 
     $index->delete($hit->id); // $hit->id is not key , it's lucene unique index of the row that has key = $id 
} 
$index->commit(); // apply changes (delete) before index new data 

doc = new Zend_Search_Lucene_Document(); 
$doc->addField(Zend_Search_Lucene_Field::keyword('key', $id)); 
$doc->addField(Zend_Search_Lucene_Field::Text('user', $user, 'utf-8')); 
関連する問題