Я строю индексированный поиск. Я открываю индекс так:
$index = Zend_Search_Lucene::open(ROOT_PATH.'/lucene/jedinice');
$index_elements = Zend_Search_Lucene::open(ROOT_PATH.'/lucene/elementi');
Остальная часть моего кода выглядит следующим образом:
$obj = new stdClass();$frontendOptions = array(
'lifetime' => 7200, // Cache lifetime of 2 hours
'automatic_serialization' => true
);
$backendOptions = array(
'cache_dir' => ROOT_PATH.'cache/services' // Directory where to put the cache files
);
// Getting a Zend_Cache_Core object
$cache = Zend_Cache::factory(
'Core','File', $frontendOptions, $backendOptions
);
$cacheId = md5($criteria->search_term);
$resultSet = array();
if (! $resultSet = $cache->load($cacheId))
{
$hits = $index->find($criteria->search_term);
$hits_elements = $index_elements->find($criteria->search_term, 'ElementKaoTekst');
fwrite($debug_file, serialize($hits) ."\n");
fwrite($debug_file, serialize($hits_elements) ."\n");
if ($hits)
{
foreach ($hits as $hit) {
$resultSetEntry = array();
$resultSetEntry['ID'] = $hit->ID;
$resultSetEntry['Naziv'] = $hit->Naziv;
$resultSetEntry['UIDJedinica'] = $hit->UID;
$resultSetEntry['UIDElement'] = '';
$resultSetEntry['Type'] = $hit->Type;
$resultSetEntry['IDElementTip'] = 0;
$resultSetEntry['KratkiOpis'] = $hit->KratkiOpis;
$resultSet[] = $resultSetEntry;
}
}
if ($hits_elements)
{
foreach ($hits_elements as $hit) {
$resultSetEntry = array();
$resultSetEntry['ID'] = $hit->ID;
$resultSetEntry['Naziv'] = $hit->Naziv;
$resultSetEntry['UIDJedinica'] = $hit->UIDJedinica;
$resultSetEntry['UIDElement'] = $hit->UID;
$resultSetEntry['Type'] = $hit->Type;
$resultSetEntry['IDElementTip'] = $hit->IDElementTip;
$resultSetEntry['KratkiOpis'] = $hit->KratkiOpis;
$resultSet[] = $resultSetEntry;
}
}
$count_all = ($resultSet) ? count($resultSet) : 0;
$resultSet = array ('result' => $resultSet, 'count_all' => $count_all);
$cache->save($resultSet, $cacheId);
}
$start_id = $criteria->offset;
$end_id = $criteria->offset + $criteria->limit;
fwrite($debug_file, $start_id. ' od ' . $end_id ."\n");
$obj->trazeneJediniceObj = array();
fwrite($debug_file, 'ser'."\n");
fwrite($debug_file, serialize($resultSet['result'])."\n");
fwrite($debug_file, count($resultSet['result'])."\n");
if ( ! empty ($resultSet['result']))
{
for ($result_id = $start_id; $result_id < $end_id; $result_id++)
{
$obj->trazeneJediniceObj[] = array(
'ID' => $resultSet['result'][$result_id]['ID'],
'Naziv' => $resultSet['result'][$result_id]['Naziv'],
'UIDJedinica' => $resultSet['result'][$result_id]['UIDJedinica'],
'UIDElement' => $resultSet['result'][$result_id]['UIDElement'],
'Type' => $resultSet['result'][$result_id]['Type'],
'IDElementTip' => $resultSet['result'][$result_id]['IDElementTip'],
'KratkiOpis' => $resultSet['result'][$result_id]['KratkiOpis'],
);
}
}
$obj->count_all = $resultSet['count_all'];
return $obj;
}
catch (Exception $e)
{
fwrite($debug_file, $e->getMessage() ."\n");
}
Но я получаю это исключение
Индекс не существует в указанном каталоге.
В папке elementi, которая используется в:
Zend_Search_Lucene::open(ROOT_PATH.'/lucene/elementi')
У меня есть эти файлы:
_cn.cfs
optimization.lock.file
read.lock
read-lock-processing.lock
segments
segments_du
write.lock
Это все файлы, которые мне нужны? Я не создал этот индекс; Я просто использую это. Как я могу загрузить этот индекс, используя Zend, или может быть какое-то другое решение?
Я только столкнулся с подобной проблемой, хотя моя папка содержала только файл write.lock.
Это немного грубое исправление, и вы можете заранее рассмотреть другие варианты, так как вы в основном удаляете весь свой индекс. В любом случае мне удалось обойти это, удалив папку (в вашем примере это папка ROOT_PATH. ‘/ Lucene / elementi’) & воссоздав его, вызвав следующую функцию.
Zend_Search_Lucene::create(DIRECTORY_HERE);
Возможно, вам лучше начать с проверки прав доступа к папкам / файлам.
Других решений пока нет …