Zend_Search_Lucene dizin oluşturma ve güncelleme

1 Cevap php

Ben onları benim web aranmasına izin vermek için makalelerin bir dizin oluşturmak için Zend_Search_Lucene kullanıyorum. Bir yönetici güncelleştirmeleri / / admin alanında bir makale siler yaratıldığı zaman, dizini yeniden:

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

Benim soru budur. Ben makaleleri, yeniden dizin ve de silinen yazılar taşıma olduğum, neden ben her zaman "yaratmak" (yerine "açık" ve güncelleme) kullanmak değil mi? Yukarıdaki yöntemi kullanarak, ben makaleler addDocument her zaman (yani çiftleri olurdu) ilave olacağını düşünüyorum. Bunu nasıl önleyeceğiz? Belge zaten dizinde olup olmadığını denetlemek için bir yolu var mı?

Ayrıca, ben tam olarak "açık" ne zaman endeksleme nasıl çalıştığını anlamak ve güncellemek sanmıyorum. Bu indeks klasöründeki dosyaları her zaman (yani _0.cfs, _1.cfs, _2.cfs var) CFS. Yeni # oluşturmak gibi görünüyor, ama ben "yaratmak" kullandığınızda, yeni bir # ile bu dosyanın üzerine yazar. CFS artırılır # ile dosya (yani, örneğin, sadece _2.cfs). Bu segmente dosyaları ne açıklayabilir misiniz?

1 Cevap

Belge zaten dizinde Evet, eğer kontrol edebilirsiniz, bir göz var this Manual Page. Daha sonra index-> ​​($ id) silin $ yoluyla endeksi bu özel Belge silebilirsiniz;, $ id termDocs yöntemin dönüş değeri olduğu. Bundan sonra sadece Belgesi'nin yeni sürümünü ekleyebilirsiniz.

Lucene oluşturur birden fazla indeks dosyaları hakkında: Eğer varolan bir dizini değiştirmek her zaman, Lucene gerçekten varolan dosyaları değiştirmek değil, yaptığınız her değişiklik için kısmi dizin ekler. Bu performans için son derece kötü olduğunu, ancak bu etrafında basit bir yolu var. Her Bunu endekse yapmak değiştirdikten sonra:) $ index-> ​​optimize (; - Bu dramatik searchtimes iyileştirilmesi, gerçek dizin için tüm kısmi dosyaları ekler.