* @copyright Copyright (C) 2010, Uwe Steinmann * @version Release: @package_version@ */ /** * Class for searching in a lucene index. * * @category DMS * @package SeedDMS_Lucene * @version @version@ * @author Uwe Steinmann * @copyright Copyright (C) 2011, Uwe Steinmann * @version Release: @package_version@ */ class SeedDMS_Lucene_Search { /** * @var object $index lucene index * @access protected */ protected $index; /** * Create a new instance of the search * * @param object $index lucene index * @return object instance of SeedDMS_Lucene_Search */ function __construct($index) { /* {{{ */ $this->index = $index; $this->version = '@package_version@'; if($this->version[0] == '@') $this->version = '3.0.0'; } /* }}} */ /** * Get document from index * * @param object $index lucene index * @return object instance of SeedDMS_Lucene_Document of false */ function getDocument($id) { /* {{{ */ $hits = $this->index->find('document_id:D'.$id); return $hits ? $hits[0] : false; } /* }}} */ /** * Get folder from index * * @param object $index lucene index * @return object instance of SeedDMS_Lucene_Document of false */ function getFolder($id) { /* {{{ */ $hits = $this->index->find('document_id:F'.$id); return $hits ? $hits[0] : false; } /* }}} */ /** * Search in index * * @param object $index lucene index * @return object instance of SeedDMS_Lucene_Search */ function search($term, $fields=array(), $limit=array()) { /* {{{ */ $querystr = ''; $term = trim($term); if($term) { $querystr = substr($term, -1) != '*' ? $term.'*' : $term; } if(!empty($fields['owner'])) { if(is_string($owner)) { if($querystr) $querystr .= ' && '; $querystr .= 'owner:'.$owner; } elseif(is_array($fields['owner'])) { if($querystr) $querystr .= ' && '; $querystr .= '(owner:"'; $querystr .= implode('" || owner:"', $fields['owner']); $querystr .= '")'; } } if(!empty($fields['category'])) { if($querystr) $querystr .= ' && '; $querystr .= '(category:"'; $querystr .= implode('" || category:"', $fields['category']); $querystr .= '")'; } if(!empty($fields['status'])) { if($querystr) $querystr .= ' && '; $querystr .= '(status:"'; $querystr .= implode('" || status:"', $fields['status']); $querystr .= '")'; } if(!empty($fields['user'])) { if($querystr) $querystr .= ' && '; $querystr .= '(users:"'; $querystr .= implode('" || users:"', $fields['user']); $querystr .= '")'; } if(!empty($fields['rootFolder']) && $fields['rootFolder']->getFolderList()) { if($querystr) $querystr .= ' && '; $querystr .= '(path:"'; $tmp[] = $fields['rootFolder']->getID(); $querystr .= implode('" && path:"', $tmp); //$querystr .= $fields['rootFolder']->getFolderList().$fields['rootFolder']->getID().':'; $querystr .= '")'; } if(!empty($fields['startFolder']) && $fields['startFolder']->getFolderList()) { if($querystr) $querystr .= ' && '; $querystr .= '(path:"'; // $querystr .= str_replace(':', 'x', $fields['startFolder']->getFolderList().$fields['startFolder']->getID().':'); $tmp = array();//explode(':', substr($fields['startFolder']->getFolderList(), 1, -1)); $tmp[] = $fields['startFolder']->getID(); $querystr .= implode('" && path:"', $tmp); // $querystr .= str_replace(':', ' ', $fields['startFolder']->getFolderList().$fields['startFolder']->getID()); $querystr .= '")'; } try { $query = Zend_Search_Lucene_Search_QueryParser::parse($querystr); try { $hits = $this->index->find($query); $recs = array(); $c = 0; foreach($hits as $hit) { if($c >= $limit['offset'] && ($c-$limit['offset'] < $limit)) $recs[] = array('id'=>$hit->id, 'document_id'=>$hit->document_id); $c++; } return array('count'=>count($hits), 'hits'=>$recs, 'facets'=>array()); } catch (Zend_Search_Lucene_Exception $e) { return false; } } catch (Zend_Search_Lucene_Search_QueryParserException $e) { return false; } } /* }}} */ } ?>