2009-09-28 15 views
8

Web sitemde aranmasına izin vermek için makaleler dizini oluşturmak üzere Zend_Search_Lucene kullanıyorum. Bir yönetici güncellemeleri// yaratır yönetici alanında bir makale siler zaman, endeks yeniden oluşturulana:Zend_Search_Lucene dizinleri oluşturma ve güncelleştirme

$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(); 

Sorum şudur. Makaleleri yeniden dizine alıp, silinen makaleleri de işlediğimden, neden her seferinde "oluştur" u kullanmamam gerekiyor ("açık" ve "güncelleme" yerine)? Yukarıdaki yöntemi kullanarak, makalelerin her defasında addDocument ile ekleneceğini düşünüyorum (bu nedenle çiftler olacaktır). Bunu nasıl önleyebilirim? Bir belgenin dizinde var olup olmadığını kontrol etmenin bir yolu var mı?

Ayrıca, dizin açmanın "açtığınızda" ve onu güncelleştirdiğinizde nasıl çalıştığını tam olarak anlayamıyorum. İndeks klasöründe her zaman yeni # .cfs (bu yüzden _0.cfs, _1.cfs, _2.cfs) dosyaları oluşturuyor gibi görünüyor, ancak "create" kullandığımda bu dosyayı yeni bir # .cfs ile üzerine yazar. artımlı # ile dosya (örneğin, sadece _2.cfs). Bu bölümlere ayrılmış dosyaların ne olduğunu açıklayabilir misiniz?

cevap

8

Evet, bir Belgenin zaten dizinde olup olmadığını kontrol edebilirsiniz, this Manual Page'a bakın. Bu özel belgeyi indeksden $ index-> ​​delete ($ id), yani $ id teriminin termDocs yönteminin dönüş değeriyle silebilirsiniz. Bundan sonra sadece Belge'nin yeni sürümünü ekleyebilirsiniz.

Lucene'nin oluşturduğu birden çok dizin dosyası hakkında: Varolan bir dizini her değiştirdiğinizde, Lucene mevcut dosyaları gerçekten değiştirmez, ancak yaptığınız her değişiklik için kısmi dizin ekler. Bu, performans için son derece kötü, ancak bunun etrafında basit bir yol var. Endekste yaptığınız her değişiklikten sonra bunu yapın: $ index-> ​​optimize(); - Bu, tüm kısmi dosyaları gerçek indekse ekleyerek, arama zamanlarını önemli ölçüde artırır.

+0

satıldı! çok teşekkürler. – typeoneerror

İlgili konular