Если честно, я бы порекомендовал использовать Zend_Lucene , поскольку, хотя на первый взгляд это выглядит запутанно, его очень просто использовать, как только вы справитесь с ним. Хотя индексация медленная, поиск очень быстрый.
Если вы хотите написать быструю и мощную поисковую систему, вы не найдете реализацию в учебнике, вам лучше будет провести небольшое исследование и почитать статьи на эту тему. Другими словами, вы не сможете написать что-нибудь на PHP, чтобы конкурировать с Zend Lucene без большого количества исследований и тяжелой работы.
Документы очень хорошие, и мне удалось внедрить Zend Lucene в проект, не основанный на Zend Framework. Это просто требует полчаса, потраченного на чтение и усвоение документов, и еще полчаса на написание быстрого набора тестов для проверки правильности ваших предположений.
Чтобы создать документ с идентификатором автомобиля и сделать:
//if it hasn't been created, you need to use ::create rather than ::open
$index = Zend_Search_Lucene::open('/data/my-index');
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Text('Car', 'MyCar'));
$doc->addField(Zend_Search_Lucene_Field::Text('Make', 'BMW'));
$index->addDocument($doc);
Чтобы найти автомобили:
$index = Zend_Search_Lucene::open('/data/my-index');
$result = $index->find('Car:MyCar');
foreach ( $result as $hit ){
echo $hit->Make;
}
Недостатком является то, что Zend_Lucene не является механизмом хранения, он не дает никаких гарантий относительно хранилища, поэтому, хотя вы можете использовать его для хранения записей, использование правильной базы данных было бы лучшим вариантом. Это одна из проблем, с которыми я столкнулся, вам просто нужно синхронизировать как индекс поиска, так и базу данных. Лучший способ, который я нашел, это просто создать класс-оболочку, который вызывал бы add / remove как для базы данных, так и для индекса.