Поиск нескольких индексов одновременно с помощью Lucene Search
Я использую Zend_Search_Lucene для реализации поиска по сайту. Я создал отдельные индексы для разных типов данных (например, один для пользователей, один для сообщений и т. Д.). Результаты аналогично разделены по типу данных, однако есть опция "все", которая должна показывать комбинацию различных типов результатов. Можно ли искать по разным показателям одновременно? или я должен индексировать все во всем индексе?
Обновление: readme для ZF 1.8 предполагает, что теперь это можно сделать в ZF 1.8, но я не смог отследить, где это находится в документации.
3 ответа
Поэтому после некоторых исследований вы должны использовать Zend_Search_Lucene_Interface_MultiSearcher. Я не вижу никаких упоминаний об этом в документации на момент написания этой статьи, но если вы посмотрите на реальный класс в ZF 1.8, это просто использовать
$index = new Zend_Search_Lucene_Interface_MultiSearcher();
$index->addIndex(Zend_Search_Lucene::open('search/index1'));
$index->addIndex(Zend_Search_Lucene::open('search/index2'));
$index->find('someSearchQuery');
Обратите внимание, что он не следует синтаксису PEAR, поэтому мы не будем работать с Zend_Loader::loadClass
Именно так я и обработал поиск по huddler.com. Я использовал несколько индексов Zend_Search_Lucene, по одному на тип данных. Для опции "все" у меня просто был другой индекс, который включал все из всех индексов - поэтому, когда я добавил документы в индекс, я добавил их дважды, один раз в соответствующий индекс "типа" и один раз в "все". " индекс. Zend Lucene сильно недооценен по сравнению с другими реализациями Lucene, так что это было лучшее решение, которое я нашел. Вы обнаружите, что порт Zend поддерживает только подмножество синтаксиса запросов lucene, и плохо - даже для умеренных индексов (10–100 МБ), запросы, такие как "a*", или фразы в кавычках не работают должным образом (если совсем).
Когда мы принесли большой сайт на нашу платформу, мы обнаружили, что Zend Lucene не масштабируется. Наш индекс достиг примерно 1,0 ГБ, а простые запросы занимали до 15 секунд. Некоторые запросы заняли минуту или больше. И создание индекса с нуля заняло около 20 часов.
Я переключился на Solr; Solr не только выполняет в 50 раз быстрее при индексации и в 1000 раз быстрее для многих запросов (большинство запросов заканчиваются менее чем за 5 мс, все заканчиваются менее чем за 100 мс), это гораздо более мощный инструмент. Кроме того, мы смогли перестроить наш индекс более 100 000 документов с нуля за 30 минут (вместо 20 часов).
Теперь все в одном индексе Solr с полем типа; Я выполняю несколько запросов к индексу для каждого поиска, каждый с различным фильтром "type:" и один без "type:" для опции "all".
Если вы планируете увеличить индекс до 100+ МБ, вы получаете по крайней мере несколько поисковых запросов в минуту или хотите предложить какие-либо расширенные функции поиска, я настоятельно рекомендую отказаться от Zend_Search_Lucene.
Я не знаю, как он интегрируется с Zend, но в Lucene можно использовать MultiSearcher вместо обычного IndexSearcher.