2009-03-23 3 views
1

Я работаю над приложением в http://demos.zatechcorp.com/codeigniter/Zend Framework Lucene Boolean/«Google» -как поиск

В своем нынешнем воплощении работает на моей машине, я загрузил ZendFramework внутри Codeigniter, и генерируется индекс, как это :

// ... Some code that loads all the markets 
    foreach ($markets as $market) 
    { 
     $doc = new Zend_Search_Lucene_Document(); 
     // Id for retrieval 
     $doc->addField(Zend_Search_Lucene_Field::UnIndexed('id', $market->id)); 
     // Store document URL to identify it in search result. 
     $doc->addField(Zend_Search_Lucene_Field::Text('url', $market->permalink)); 
     // Index document content 
     $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $market->description)); 
     // Title 
     $doc->addField(Zend_Search_Lucene_Field::Text('title', $market->title)); 
     // Phone 
     $doc->addField(Zend_Search_Lucene_Field::Keyword('phone', $market->phone)); 
     // Fax 
     $doc->addField(Zend_Search_Lucene_Field::Keyword('fax', $market->fax)); 
     // Street 
     $doc->addField(Zend_Search_Lucene_Field::Keyword('street', $market->street)); 
     // City 
     $doc->addField(Zend_Search_Lucene_Field::Keyword('city', $market->city)); 
     // State 
     $doc->addField(Zend_Search_Lucene_Field::Keyword('state', $market->state)); 
     // Zip 
     $doc->addField(Zend_Search_Lucene_Field::Keyword('zip', $market->zip)); 
     // Type 
     $doc->addField(Zend_Search_Lucene_Field::UnIndexed('type', 'market')); 

     // Store Document 
     $index->addDocument($doc); 
    } 

в своих поисках, я делаю это:

$hits = $index->find($q); 

Это работает с простыми словами, но когда я хочу, чтобы сделать поиск как «Шеба Foods» (кавычки включают г), он возвращает один результат, но не тот, который даже не имеет слова «Шеба».

Я отошел от полнотекстового поиска MySQL из-за его очевидных проблем и не смог добиться этого.

Я смотрел на метод Zend_Search_Lucene_Search_QueryParser :: parse(). Ответ лежит в этом методе?

ответ

3

я понял это. С Lucene вы можете добавить поле с именем «id», но получение идентификатора из хита дает вам что-то другое - я предполагаю, что это идентификатор поискового запроса во всех результатах поиска.

То, что я должен был сделать в этом случае был использовать другое имя поля, как это:

// Id for retrieval 
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('item_id', $market->id)); 
+1

«id» - это идентификатор документа, хранящегося в индексе. вы * можете * использовать id, вам просто нужно обратиться к нему через getDocument() -> id. – typeoneerror

-2

Я использовал полнотекстовый поиск MySQL в прошлом, но это действительно интенсивный процессор.

Вы всегда можете рассчитывать на SELECT * FROM таблица, в которой столбец = '% запросов%'

:)

+0

Это должно, вероятно, будет SELECT * FROM таблицы WHERE колонка LIKE '% запросы%. Тем не менее, этот конкретный метод не предлагает много возможностей поиска (логические операции, исключения и т. Д.). –

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