2009-08-08 3 views
2

EDIT:Zend_Search_Lucene Помощь

мне удалось решить эту проблему с помощью:

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

Еще одна проблема, хотя в том, что индекс возвращает правильные результаты, но с неправильным идентификатором (ID является первичным ключ). Более конкретно, возвращаемые поля id на 1 меньше, чем реальные идентификаторы (id-1) в базе данных, которые я использую для создания индекса.

Это очень странно.


Что с этими поисковыми запросами:

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

Первого запрос должен найти только результаты с типом = фото, второй один ищет только видео. Но они оба возвращают фотографии и видео.

Вот как я строю индекс:

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

А вот как я искать его:

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

Любые идеи?

ответ

2

Я только что проверил некоторые тесты в своем собственном индексе поиска, и проблема, похоже, в самом запросе, а не в коде. «И» в запросе является оператором, а также «+». Парсер запросов, похоже, путается двойной логикой оператора, между которой нет термина. Это была кодовая цитата, которую я нашел в своих документах:

Если используется стиль AND/OR/NOT, то между всеми условиями запроса должен присутствовать оператор AND или OR. Каждому термину также может предшествовать оператор NOT. Оператор AND имеет более высокий приоритет, чем оператор OR. Это отличается от поведения Java Lucene.

Теперь выполнения запроса через анализатор, это был SEARCH_QUERY объект:

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 или удаления +, и только с помощью 1.

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) 

Единственное отличие: AND:

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

+:

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

Оператор AND требует, чтобы оба поисковых запросов требуется в результате, когда в качестве + требует только значение справа, потребуется.

Так просто изменить до запроса

"lorem ipsum" AND type:photo

И вы должны получить результаты, которые вы ищете.

+0

Я думаю, что сделал. Еще одна проблема: поиск возвращает результаты, начинающиеся с id = 0 (id - первичный ключ), а id в базе данных начинается с 1. Кажется, индекс возвращает id - 1. –

+0

Почему это? Насколько я вижу. –

+0

Я отредактировал мое первое сообщение. –

2

О hte "id problem" Я бы предположил, что «id» - это внутренняя переменная, используемая для доступа к каждому результату. Поэтому я бы рекомендовал переименовать поле в sth. как «entryId», а затем использовать $resultItem->entryId

+0

Да, это было :) Спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^