Zend_Search_Lucene Yardım

2 Cevap php

EDIT:

Ben kullanarak sorunu çözmek için başardı:

+"lorem ipsum" +type:photo
+"lorem ipsum" +type:video

Başka bir sorun olsa endeks doğru sonuçları dönüyor ama yanlış id (id birincil anahtar) olmasıdır. Ben dizin oluşturmak için kullandığınız veritabanı - Daha spesifik olarak, iade id alanlar gerçek kimlikleri (1 id) 1'den azdır.

Bu çok garip.


Ne bu arama sorguları ile yanlış:

"lorem ipsum" AND +type:photo
"lorem ipsum" AND +type:video

İlk sorgu türü = fotoğrafı, diğeri yalnızca video arama sadece sonuç bulmak gerekiyordu. Ama iki fotoğraf ve videoları hem dönüyor.

Burada dizin oluşturmak nasıl:

    // create media index
    $index = Zend_Search_Lucene::create('/data/media_index');
    // get all media
    $media = $this->_getTable('Media')->get();
    // iterate through media and build index
    foreach ($media as $m) {

        $doc = new Zend_Search_Lucene_Document();

        $doc->addField(Zend_Search_Lucene_Field::UnIndexed('id',
                                                           $m->id));
        $doc->addField(Zend_Search_Lucene_Field::UnIndexed('thumb_path',
                                                           $m->thumb_path));
        $doc->addField(Zend_Search_Lucene_Field::Keyword('title',
                                                         $m->title));
        $doc->addField(Zend_Search_Lucene_Field::UnStored('description',
                                                          $m->description));
        $doc->addField(Zend_Search_Lucene_Field::Keyword('type',
                                                         $m->type));

        $index->addDocument($doc);

    }
    // commit the index
    $index->commit();

Ve burada bunu araştırın nasıl:

    $index = Zend_Search_Lucene::open('/data/media_index');
    $this->view->photos = $index->find('"lorem ipsum" AND +type:photo');
    $this->view->videos = $index->find('"lorem ipsum" AND +type:video');

Herhangi bir fikir?

2 Cevap

Ben sadece kendi arama indeksi üzerinde bazı testler koştu ve sorun sorguda kendisini ve kod değil gibi görünüyor. "VE" sorguda bir operatör olduğunu, ve bu yüzden "+". Sorgu ayrıştırıcı arasında hiçbir dönem ile çift operatör mantığı ile karışık gibi görünüyor. Bu onların dokümanlar bulunan bir blok alıntı vardı:

VE / VEYA / stil kullanılırsa, daha sonra bir AND veya OR operatörü, tüm sorgu terimleri arasındaki mevcut olmalıdır. Her dönem de DEĞİL operatörü öncesinde olabilir. AND operatörü OR operatörü daha yüksek önceliğe sahiptir. Bu Java Lucene davranış farklıdır.

Şimdi, çözümleyici aracılığıyla sorguyu çalıştıran, bu search_query nesne oldu:

string '"lorem ipsum" AND +type:photo' (length=29)

object(Zend_Search_Lucene_Search_Query_MultiTerm)[230]
  private '_terms' => 
    array
      0 => 
        object(Zend_Search_Lucene_Index_Term)[236]
          public 'field' => null
          public 'text' => string 'lorem' (length=5)
      1 => 
        object(Zend_Search_Lucene_Index_Term)[237]
          public 'field' => null
          public 'text' => string 'ipsum' (length=5)
      2 => 
        object(Zend_Search_Lucene_Index_Term)[238]
          public 'field' => null
          public 'text' => string 'and' (length=3)
      3 => 
        object(Zend_Search_Lucene_Index_Term)[239]
          public 'field' => null
          public 'text' => string 'type' (length=4)
      4 => 
        object(Zend_Search_Lucene_Index_Term)[240]
          public 'field' => null
          public 'text' => string 'photo' (length=5)

AND kaldırarak, biraz sorgusunu değiştirilmesi veya + kaldırarak, ve sadece 1 kullanarak.

string '"lorem ipsum" +type:photo' (length=25)
string '"lorem ipsum" AND type:photo' (length=28)

object(Zend_Search_Lucene_Search_Query_Boolean)[227]
  private '_subqueries' => 
    array
      0 => 
        object(Zend_Search_Lucene_Search_Query_Phrase)[230]
          private '_terms' => 
            array
              0 => 
                object(Zend_Search_Lucene_Index_Term)[233]
                  public 'field' => null
                  public 'text' => string 'lorem' (length=5)
              1 => 
                object(Zend_Search_Lucene_Index_Term)[234]
                  public 'field' => null
                  public 'text' => string 'ipsum' (length=5)
      1 => 
        object(Zend_Search_Lucene_Search_Query_Term)[235]
          private '_term' => 
            object(Zend_Search_Lucene_Index_Term)[232]
              public 'field' => string 'type' (length=4)
              public 'text' => string 'photo' (length=5)

Tek fark: AND,

  private '_signs' => 
    array
      0 => boolean true
      1 => boolean true

+:

  private '_signs' => 
    array
      0 => null
      1 => boolean true

AND operatörü arama sorgularının her iki + sadece sağdaki değer gerektiriyor olarak gerekli sonucu, gerekli gerektirir.

Dolayısıyla, sadece sorguyu kadar değiştirmek

"lorem ipsum" AND type:photo

Ve aradığınız sonuçlar almalısınız.

Hte "id sorun" hakkında i "id" Her sonucu erişmek için kullanılan iç değişken olduğunu tahmin ediyorum. Yani sth için alanı yeniden adlandırmak için öneriyoruz. gibi "entryid" ve ardından kullanmak $resultItem->entryId