Ejemplo n.º 1
0
 function getMatchingConnections($criteria)
 {
     $index = $this->getIndex();
     Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0);
     Zend_Search_Lucene::setResultSetLimit(25);
     // TODO during dev
     $results = $index->find($criteria);
     $ret = array();
     foreach ($results as $hit) {
         $res = array();
         $res['created'] = $hit->created;
         try {
             $res['title'] = $hit->title;
         } catch (Zend_Search_Lucene_Exception $e) {
             $res['title'] = '';
         }
         try {
             $res['url'] = $hit->url;
         } catch (Zend_Search_Lucene_Exception $e) {
             $res['url'] = '';
         }
         try {
             $res['keywords'] = $hit->keywords;
         } catch (Zend_Search_Lucene_Exception $e) {
             $res['keywords'] = '';
         }
         try {
             $res['language'] = $hit->language;
         } catch (Zend_Search_Lucene_Exception $e) {
             $res['language'] = '';
         }
         try {
             $res['geo_lat'] = $hit->geo_lat;
         } catch (Zend_Search_Lucene_Exception $e) {
             $res['geo_lat'] = '';
         }
         try {
             $res['geo_lon'] = $hit->geo_lon;
         } catch (Zend_Search_Lucene_Exception $e) {
             $res['geo_lon'] = '';
         }
         try {
             $res['geo_zoom'] = $hit->geo_zoom;
         } catch (Zend_Search_Lucene_Exception $e) {
             $res['geo_zoom'] = '';
         }
         $res['class'] = 'tablename';
         $res['metadata'] = '';
         if ($res['geo_lat'] && $res['geo_lon']) {
             $res['class'] .= ' geolocated connection';
             $res['metadata'] = " data-geo-lat=\"{$res['geo_lat']}\" data-geo-lon=\"{$res['geo_lon']}\"";
             if (isset($res['geo_zoom'])) {
                 $res['metadata'] .= " data-geo-zoom=\"{$res['geo_zoom']}\"";
             }
             $res['metadata'] .= ' data-icon-name="tiki"';
         }
         $ret[] = $res;
     }
     return $ret;
 }
Ejemplo n.º 2
0
 public function luceneSearchAction()
 {
     $this->view->layout()->disableLayout();
     $this->_helper->viewRenderer->setNoRender(true);
     $path = PUBLIC_PATH . '/tmp/lucene';
     $index = Zend_Search_Lucene::open($path);
     //        $term  = new Zend_Search_Lucene_Index_Term('ritesh','title');
     //        $subquery1 = new Zend_Search_Lucene_Search_Query_Term($term);
     //
     //        $from = new Zend_Search_Lucene_Index_Term('0', 'empcode');
     //        $to   = new Zend_Search_Lucene_Index_Term('53', 'empcode');
     //        $subquery2 = new Zend_Search_Lucene_Search_Query_Range($from, $to, true);
     //
     //        $query = new Zend_Search_Lucene_Search_Query_Boolean();
     //        $query->addSubquery($subquery1, true  );
     //        $query->addSubquery($subquery2, null );
     //        Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive());
     //        $hits  = $index->find($query);
     Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive());
     Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(1);
     $hits = $index->find("empcode:[000 TO 200]");
     foreach ($hits as $h) {
         echo "Title:" . $h->title;
         echo "-------EmpCode:" . $h->empcode;
         echo "<br>";
     }
 }
Ejemplo n.º 3
0
 /**
  * @param $queryString
  * @return array
  */
 public function find($queryString)
 {
     $queryString = trim($queryString);
     if (empty($queryString)) {
         return ["queryString" => $queryString, "message" => "No String"];
     } else {
         $index = \Zend_Search_Lucene::open($this->indexfile);
         $res = explode(' ', $queryString);
         \Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(1);
         \Zend_Search_Lucene::setResultSetLimit(5);
         $query = new \Zend_Search_Lucene_Search_Query_Boolean();
         foreach ($res as $val) {
             if (!empty($val)) {
                 $subquery = new \Zend_Search_Lucene_Search_Query_Boolean();
                 $searchkey1 = $val . "*";
                 $pattern = new \Zend_Search_Lucene_Index_Term($searchkey1, "name");
                 $userQuery = new \Zend_Search_Lucene_Search_Query_Wildcard($pattern);
                 $patternUsername = new \Zend_Search_Lucene_Index_Term($searchkey1, "username");
                 $usernameQuery = new \Zend_Search_Lucene_Search_Query_Wildcard($patternUsername);
                 $subquery->addSubquery($userQuery, null);
                 $subquery->addSubquery($usernameQuery, null);
                 $query->addSubquery($subquery, true);
             }
         }
         $hits = $index->find($query);
         if (!empty($hits)) {
             $results = [];
             foreach ($hits as $hit) {
                 if ($hit->username != $_SESSION['user']->username) {
                     $results[] = $hit->username;
                 }
             }
             if (!empty($results)) {
                 /** @noinspection PhpUndefinedMethodInspection */
                 /** @var Users $users */
                 $users = $_SESSION['user']->getTable();
                 if (isset($_POST['friends'])) {
                     /** @noinspection PhpUndefinedMethodInspection */
                     $friends = $_SESSION['user']->getFriendList();
                     if (empty($friends)) {
                         return ["queryString" => $queryString, "users" => []];
                     } else {
                         $userresult = $users->getSet($results, 'u.username');
                     }
                 } else {
                     $userresult = $users->getSet($results, "u.username", ["u.userid", "u.username", "u.name"]);
                 }
                 return ["queryString" => $queryString, "users" => $userresult->toArray()];
             }
         }
     }
     return ["queryString" => $queryString];
 }
Ejemplo n.º 4
0
 protected function prepareLuceneQuery($keyword)
 {
     $keyword = strtolower($keyword);
     $query = new Zend_Search_Lucene_Search_Query_Boolean();
     # multiterm query
     $subquery1 = new Zend_Search_Lucene_Search_Query_MultiTerm();
     foreach (explode(' ', $keyword) as $key) {
         if (!trim($key)) {
             continue;
         }
         $subquery1->addTerm(new Zend_Search_Lucene_Index_Term($key));
     }
     # wildcard query
     Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(1);
     $tokens = preg_split('/ /', $keyword, -1, PREG_SPLIT_NO_EMPTY);
     $lastWord = trim(array_pop($tokens)) . "*";
     $pattern = new Zend_Search_Lucene_Index_Term($lastWord);
     $subquery2 = new Zend_Search_Lucene_Search_Query_Wildcard($pattern);
     $query->addSubquery($subquery1);
     $query->addSubquery($subquery2);
     return $query;
 }
Ejemplo n.º 5
0
 /**
  * Query specific matches highlighting
  *
  * @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter  Highlighter object (also contains doc for highlighting)
  */
 protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter)
 {
     /** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */
     /** Skip exact term matching recognition, keyword fields highlighting is not supported */
     // -------------------------------------
     // Recognize wildcard queries
     /** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */
     if (@preg_match('/\\pL/u', 'a') == 1) {
         $word = iconv($this->_encoding, 'UTF-8', $this->_word);
         $wildcardsPattern = '/[*?]/u';
         $subPatternsEncoding = 'UTF-8';
     } else {
         $word = $this->_word;
         $wildcardsPattern = '/[*?]/';
         $subPatternsEncoding = $this->_encoding;
     }
     $subPatterns = preg_split($wildcardsPattern, $word, -1, PREG_SPLIT_OFFSET_CAPTURE);
     if (count($subPatterns) > 1) {
         // Wildcard query is recognized
         $pattern = '';
         require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
         foreach ($subPatterns as $id => $subPattern) {
             // Append corresponding wildcard character to the pattern before each sub-pattern (except first)
             if ($id != 0) {
                 $pattern .= $word[$subPattern[1] - 1];
             }
             // Check if each subputtern is a single word in terms of current analyzer
             $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($subPattern[0], $subPatternsEncoding);
             if (count($tokens) > 1) {
                 // Do nothing (nothing is highlighted)
                 return;
             }
             foreach ($tokens as $token) {
                 $pattern .= $token->getTermText();
             }
         }
         require_once 'Zend/Search/Lucene/Index/Term.php';
         $term = new Zend_Search_Lucene_Index_Term($pattern, $this->_field);
         require_once 'Zend/Search/Lucene/Search/Query/Wildcard.php';
         $query = new Zend_Search_Lucene_Search_Query_Wildcard($term);
         $query->_highlightMatches($highlighter);
         return;
     }
     // -------------------------------------
     // Recognize one-term multi-term and "insignificant" queries
     require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
     $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding);
     if (count($tokens) == 0) {
         // Do nothing
         return;
     }
     if (count($tokens) == 1) {
         $highlighter->highlight($tokens[0]->getTermText());
         return;
     }
     //It's not insignificant or one term query
     $words = array();
     foreach ($tokens as $token) {
         $words[] = $token->getTermText();
     }
     $highlighter->highlight($words);
 }
Ejemplo n.º 6
0
 public function tearDown()
 {
     Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength($this->_wildcardMinPrefix);
     Zend_Search_Lucene_Search_Query_Fuzzy::setDefaultPrefixLength($this->_defaultPrefixLength);
 }
Ejemplo n.º 7
0
 public function testWildcardQuery()
 {
     $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files');
     $wildcardMinPrefix = Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength();
     Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0);
     $hits = $index->find('*cont*');
     $this->assertEquals(count($hits), 9);
     $expectedResultset = array(array(8, 0.328087, 'IndexSource/contributing.html'), array(2, 0.318592, 'IndexSource/contributing.patches.html'), array(7, 0.260137, 'IndexSource/contributing.bugs.html'), array(0, 0.203372, 'IndexSource/contributing.documentation.html'), array(1, 0.202366, 'IndexSource/contributing.wishlist.html'), array(4, 0.052931, 'IndexSource/copyright.html'), array(3, 0.01707, 'IndexSource/about-pear.html'), array(5, 0.01015, 'IndexSource/authors.html'), array(9, 0.003504, 'IndexSource/core.html'));
     foreach ($hits as $resId => $hit) {
         $this->assertEquals($hit->id, $expectedResultset[$resId][0]);
         $this->assertTrue(abs($hit->score - $expectedResultset[$resId][1]) < 1.0E-6);
         $this->assertEquals($hit->path, $expectedResultset[$resId][2]);
     }
     Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength($wildcardMinPrefix);
 }
Ejemplo n.º 8
0
 /**
  * Transform entry to a subquery
  *
  * @param string $encoding
  * @return Zend_Search_Lucene_Search_Query
  * @throws Zend_Search_Lucene_Search_QueryParserException
  */
 public function getQuery($encoding)
 {
     if (strpos($this->_term, '?') !== false || strpos($this->_term, '*') !== false) {
         if ($this->_fuzzyQuery) {
             // require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
             throw new Zend_Search_Lucene_Search_QueryParserException('Fuzzy search is not supported for terms with wildcards.');
         }
         $pattern = '';
         $subPatterns = explode('*', $this->_term);
         $astericFirstPass = true;
         foreach ($subPatterns as $subPattern) {
             if (!$astericFirstPass) {
                 $pattern .= '*';
             } else {
                 $astericFirstPass = false;
             }
             $subPatternsL2 = explode('?', $subPattern);
             $qMarkFirstPass = true;
             foreach ($subPatternsL2 as $subPatternL2) {
                 if (!$qMarkFirstPass) {
                     $pattern .= '?';
                 } else {
                     $qMarkFirstPass = false;
                 }
                 $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($subPatternL2, $encoding);
                 if (count($tokens) > 1) {
                     // require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
                     throw new Zend_Search_Lucene_Search_QueryParserException('Wildcard search is supported only for non-multiple word terms');
                 }
                 foreach ($tokens as $token) {
                     $pattern .= $token->getTermText();
                 }
             }
         }
         $term = new Zend_Search_Lucene_Index_Term($pattern, $this->_field);
         $query = new Zend_Search_Lucene_Search_Query_Wildcard($term);
         $query->setBoost($this->_boost);
         return $query;
     }
     $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_term, $encoding);
     if (count($tokens) == 0) {
         return new Zend_Search_Lucene_Search_Query_Insignificant();
     }
     if (count($tokens) == 1 && !$this->_fuzzyQuery) {
         $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field);
         $query = new Zend_Search_Lucene_Search_Query_Term($term);
         $query->setBoost($this->_boost);
         return $query;
     }
     if (count($tokens) == 1 && $this->_fuzzyQuery) {
         $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field);
         $query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_similarity);
         $query->setBoost($this->_boost);
         return $query;
     }
     if ($this->_fuzzyQuery) {
         // require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
         throw new Zend_Search_Lucene_Search_QueryParserException('Fuzzy search is supported only for non-multiple word terms');
     }
     //It's not empty or one term query
     $query = new Zend_Search_Lucene_Search_Query_MultiTerm();
     /**
      * @todo Process $token->getPositionIncrement() to support stemming, synonyms and other
      * analizer design features
      */
     foreach ($tokens as $token) {
         $term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field);
         $query->addTerm($term, true);
         // all subterms are required
     }
     $query->setBoost($this->_boost);
     return $query;
 }
 protected function setDefaultAnalyzer()
 {
     switch ($this->getFilteredOption("QUERY_ANALYSER")) {
         case "utf8num_insensitive":
             Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive());
             break;
         case "utf8num_sensitive":
             Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num());
             break;
         case "utf8_insensitive":
             Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive());
             break;
         case "utf8_sensitive":
             Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
             break;
         case "textnum_insensitive":
             Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive());
             break;
         case "textnum_sensitive":
             Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_textNum());
             break;
         case "text_insensitive":
             Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive());
             break;
         case "text_sensitive":
             Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Text());
             break;
         default:
             Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive());
             break;
     }
     Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(intval($this->getFilteredOption("WILDCARD_LIMITATION")));
 }
Ejemplo n.º 10
0
 /**
  *
  * @throws nc_search_exception
  */
 protected function open_index()
 {
     $path = $this->get_index_path();
     try {
         if ($this->index_exists($path)) {
             $this->index = Zend_Search_Lucene::open($path);
         } else {
             $this->index = Zend_Search_Lucene::create($path);
         }
     } catch (Zend_Search_Lucene_Exception $e) {
         throw new nc_search_exception("Cannot open Lucene index: {$e->getMessage()}");
     }
     $this->is_opened = true;
     // apply settings to the index
     Zend_Search_Lucene::setResultSetLimit($this->get_setting('ZendSearchLucene_ResultSetLimit'));
     Zend_Search_Lucene::setTermsPerQueryLimit($this->get_setting('MaxTermsPerQuery'));
     $settings = array('MaxBufferedDocs', 'MaxMergeDocs', 'MergeFactor');
     foreach ($settings as $s) {
         $setter = "set{$s}";
         $this->index->{$setter}($this->get_setting("ZendSearchLucene_{$s}"));
     }
     // set analyzer
     Zend_Search_Lucene_Analysis_Analyzer::setDefault(new nc_search_provider_zend_analyzer());
     // set fuzzy prefix length so fuzzy searches will match a wider array of possibilities
     Zend_Search_Lucene_Search_Query_Fuzzy::setDefaultPrefixLength(0);
     // set wildcard prefix length so wildcards will match a wider array of possibilities
     Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0);
     /**
      * @todo set default search fields
      */
 }
Ejemplo n.º 11
0
{
    static $instances;
    isset($name) && isset($thing) and $instances[$name] =& $thing;
    return $instances[$name];
}
ini_set("error_reporting", E_ALL & ~E_NOTICE & ~E_STRICT);
ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . dirname(__FILE__) . DIRECTORY_SEPARATOR . "zend");
singleton("errors_fatal", false);
singleton("errors_format", "html");
singleton("errors_logged", false);
singleton("errors_thrown", false);
singleton("errors_haltdb", false);
// Set the charset for Zend Lucene search indexer http://framework.zend.com/manual/en/zend.search.lucene.charset.html
require_once "Zend" . DIRECTORY_SEPARATOR . "Search" . DIRECTORY_SEPARATOR . "Lucene.php";
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive());
Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0);
// Undo magic quotes if it's enabled
if (get_magic_quotes_gpc()) {
    function stripslashes_array($array)
    {
        return is_array($array) ? array_map('stripslashes_array', $array) : stripslashes($array);
    }
    $_COOKIE = stripslashes_array($_COOKIE);
    $_FILES = stripslashes_array($_FILES);
    $_GET = stripslashes_array($_GET);
    $_POST = stripslashes_array($_POST);
    $_REQUEST = stripslashes_array($_REQUEST);
}
// Get the alloc directory
$f = trim(dirname(__FILE__));
substr($f, -1, 1) != DIRECTORY_SEPARATOR and $f .= DIRECTORY_SEPARATOR;
Ejemplo n.º 12
0
 /**
  * Constructor
  */
 public function __construct()
 {
     $this->core = Zend_Registry::get('Core');
     Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive());
     Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0);
 }
 /**
  *
  * @param string $queryStr
  * @param \Zend_Search_Lucene_Interface $index
  * @return Array $hits
  */
 public static function wildcardFindTerms($queryStr, $index)
 {
     if ($index != NULL) {
         $pattern = new \Zend_Search_Lucene_Index_Term($queryStr . '*');
         $userQuery = new \Zend_Search_Lucene_Search_Query_Wildcard($pattern);
         \Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(2);
         $index->find($userQuery);
         $terms = $userQuery->getQueryTerms();
         return $terms;
     }
 }
Ejemplo n.º 14
0
 protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter)
 {
     if (@preg_match('/\\pL/u', 'a') == 1) {
         $word = iconv($this->_encoding, 'UTF-8', $this->_word);
         $wildcardsPattern = '/[*?]/u';
         $subPatternsEncoding = 'UTF-8';
     } else {
         $word = $this->_word;
         $wildcardsPattern = '/[*?]/';
         $subPatternsEncoding = $this->_encoding;
     }
     $subPatterns = preg_split($wildcardsPattern, $word, -1, PREG_SPLIT_OFFSET_CAPTURE);
     if (count($subPatterns) > 1) {
         $pattern = '';
         foreach ($subPatterns as $id => $subPattern) {
             if ($id != 0) {
                 $pattern .= $word[$subPattern[1] - 1];
             }
             $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($subPattern[0], $subPatternsEncoding);
             if (count($tokens) > 1) {
                 return;
             }
             foreach ($tokens as $token) {
                 $pattern .= $token->getTermText();
             }
         }
         $term = new Zend_Search_Lucene_Index_Term($pattern, $this->_field);
         $query = new Zend_Search_Lucene_Search_Query_Wildcard($term);
         $query->_highlightMatches($highlighter);
         return;
     }
     $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding);
     if (count($tokens) == 0) {
         return;
     }
     if (count($tokens) == 1) {
         $highlighter->highlight($tokens[0]->getTermText());
         return;
     }
     $words = array();
     foreach ($tokens as $token) {
         $words[] = $token->getTermText();
     }
     $highlighter->highlight($words);
 }
Ejemplo n.º 15
0
 /**
  * Search all pages that match the query.
  *
  * <code>
  *  //$query = '(pi AND groupe AND partner*) OR pi-groupe';
  *    $query   = " travers projet ference coin";
  *    $options = array(
  *        'searchBool'         => true,
  *        'searchBoolType'     => 'AND',
  *        'searchByMotif'     => true,
  *        'setMinPrefixLength'=> 0,
  *        'getResultSetLimit' => 0,
  *        'searchFields'         => array(
  *                                    0=> array('sortField'=>'Contents', 'sortType'=> SORT_STRING, 'sortOrder' => SORT_ASC),
  *                                    1=> array('sortField'=>'Key', 'sortType'=> SORT_NUMERIC, 'sortOrder' => SORT_DESC)
  *                                ),
  *    );
  *    $result = $this->container->get('pi_app_admin.manager.search_lucene')->searchPagesByQuery($query, $options);
  * </code>
  *
  * @link http://framework.zend.com/manual/fr/zend.search.lucene.searching.html
  * @link http://framework.zend.com/manual/fr/learning.lucene.queries.html
  * @link http://framework.zend.com/manual/1.12/fr/zend.search.lucene.query-api.html
  * @param string $query        The search query index file
  * @param array     $options    Options of the search query of the index file
  * @return array            All Etags from pages that match the query.
  * @access    public
  *
  * @author Etienne de Longeaux <*****@*****.**>
  * @since 2012-06-11
  */
 public function searchPagesByQuery($query = "Key:*", $options = null, $locale = '')
 {
     try {
         if (isset($options) && is_array($options) && count($options) >= 1) {
             $options_values = array_map(function ($key, $value) {
                 if (in_array($value, array("true"))) {
                     return 1;
                 } elseif (in_array($value, array("false"))) {
                     return 0;
                 } elseif (!is_array($value) && preg_match_all("/[0-9]+/", $value, $nbrs, PREG_SET_ORDER)) {
                     return intval($value);
                 } else {
                     return $value;
                 }
             }, array_keys($options), array_values($options));
             $options = array_combine(array_keys($options), $options_values);
         }
         if (empty($query)) {
             return null;
         } else {
             $query = $this->container->get('sfynx.tool.string_manager')->minusculesSansAccents($query);
         }
         if (empty($locale)) {
             $locale = $this->container->get('request')->getLocale();
         }
         $options_default = array('searchBool' => true, 'searchBoolType' => 'OR', 'searchByMotif' => true, 'setMinPrefixLength' => 0, 'getResultSetLimit' => 0, 'searchFields' => '*', 'searchMaxResultByWord' => 5);
         if (is_array($options)) {
             $options = array_merge($options_default, $options);
         } else {
             $options = $options_default;
         }
         if ($options['searchBool']) {
             $q_string = $this->container->get('sfynx.tool.string_manager')->cleanWhitespace($query);
             $q_array = explode(' ', $q_string);
             if ($options['searchByMotif']) {
                 $q_array = array_map(function ($value) {
                     return $value . '*';
                 }, array_values($q_array));
             }
             switch ($options['searchBoolType']) {
                 case 'OR':
                     $new_query = implode(' OR ', $q_array);
                     break;
                 case 'AND':
                     $new_query = implode(' AND ', $q_array);
                     break;
                 default:
                     break;
             }
         } else {
             $new_query = $query;
         }
         // Open the index.
         self::open($this->_indexPath);
         // Set minimum prefix length.
         \Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength($options['setMinPrefixLength']);
         // Set result set limit.
         \Zend_Search_Lucene::setResultSetLimit($options['getResultSetLimit']);
         // Performs a query against the index.
         if (is_array($options['searchFields']) && $query != "Key:*") {
             $fields_vars = "\$hits = self::\$_index->find(\$new_query,";
             $i = 0;
             foreach ($options['searchFields'] as $key => $valuesField) {
                 $sortField = $valuesField["sortField"];
                 if (isset($valuesField["sortType"]) && !empty($valuesField["sortType"])) {
                     $sortType = $valuesField["sortType"];
                 } else {
                     $sortType = SORT_STRING;
                 }
                 if (isset($valuesField["sortOrder"]) && !empty($valuesField["sortOrder"])) {
                     $sortOrder = $valuesField["sortOrder"];
                 } else {
                     $sortOrder = $valuesField["sortOrder"];
                 }
                 if ($i == 0) {
                     $fields_vars .= " \"{$sortField}\", {$sortType}, {$sortOrder}";
                 } else {
                     $fields_vars .= ", \"{$sortField}\", {$sortType}, {$sortOrder}";
                 }
                 $i++;
             }
             $fields_vars .= ");";
             try {
                 setlocale(LC_ALL, $locale);
                 eval($fields_vars);
                 //                print_r($options);
                 //                 print_r($new_query);
                 //                 print_r('<br />');
                 //                 print_r($fields_vars);
                 //                 //exit;
             } catch (\Exception $e) {
                 setlocale(LC_ALL, 'fr_FR');
                 eval($fields_vars);
             }
             //eval("\$hits = self::\$_index->find(\$query, \"\$sortField\", \$sortType, \$sortOrder);");
             //$hits = self::$_index->find($query, "Contents", SORT_STRING, SORT_DESC);
             //$hits = self::$_index->find(' *"férence"* ', "Contents", SORT_STRING, SORT_ASC);
             //$hits = self::$_index->find(' *"MOTIVTelecommunication"* OR *"Sophisticated"* ', "Contents", SORT_STRING, SORT_ASC);
         } else {
             try {
                 setlocale(LC_ALL, $locale);
                 $hits = self::$_index->find($new_query);
             } catch (\Exception $e) {
                 setlocale(LC_ALL, 'fr_FR');
                 $hits = self::$_index->find($new_query);
             }
         }
         $result_search = null;
         if (isset($hits) && is_array($hits)) {
             foreach ($hits as $hit) {
                 $field = $hit->getDocument()->getFieldNames();
                 if (in_array('Key', $field)) {
                     $data['Key'] = $hit->getDocument()->Key;
                 } else {
                     $data['Key'] = "";
                 }
                 if (in_array('Route', $field)) {
                     $data['Route'] = $hit->getDocument()->Route;
                 } else {
                     $data['Route'] = "";
                 }
                 if (in_array('Title', $field)) {
                     $data['Title'] = utf8_decode($hit->getDocument()->Title);
                 } else {
                     $data['Title'] = "";
                 }
                 if (in_array('Keywords', $field)) {
                     $data['Keywords'] = utf8_decode($hit->getDocument()->Keywords);
                 } else {
                     $data['Keywords'] = "";
                 }
                 if (in_array('ModDate', $field)) {
                     $data['ModDate'] = $hit->getDocument()->ModDate;
                 } else {
                     $data['ModDate'] = "";
                 }
                 $data['MaxResultByWord'] = $options['searchMaxResultByWord'];
                 $result_search[] = $data;
             }
         }
         return $result_search;
     } catch (\Exception $e) {
         return array();
     }
 }
Ejemplo n.º 16
0
 /**
  * Set minimum prefix length
  *
  * @param integer $minPrefixLength
  */
 public static function setMinPrefixLength($minPrefixLength)
 {
     self::$_minPrefixLength = $minPrefixLength;
 }
Ejemplo n.º 17
0
 /**
  * Transform entry to a subquery
  *
  * @param string $encoding
  * @return Zend_Search_Lucene_Search_Query
  * @throws Zend_Search_Lucene_Search_QueryParserException
  */
 public function getQuery($encoding)
 {
     if (strpos($this->_term, '?') !== false || strpos($this->_term, '*') !== false) {
         if ($this->_fuzzyQuery) {
             require_once __CA_LIB_DIR__ . '/core/Zend/Search/Lucene/Search/QueryParserException.php';
             throw new Zend_Search_Lucene_Search_QueryParserException('Fuzzy search is not supported for terms with wildcards.');
         }
         $pattern = '';
         $subPatterns = explode('*', $this->_term);
         $astericFirstPass = true;
         foreach ($subPatterns as $subPattern) {
             if (!$astericFirstPass) {
                 $pattern .= '*';
             } else {
                 $astericFirstPass = false;
             }
             $subPatternsL2 = explode('?', $subPattern);
             $qMarkFirstPass = true;
             foreach ($subPatternsL2 as $subPatternL2) {
                 if (!$qMarkFirstPass) {
                     $pattern .= '?';
                 } else {
                     $qMarkFirstPass = false;
                 }
                 $pattern .= $subPatternL2;
             }
         }
         $term = new Zend_Search_Lucene_Index_Term(strtolower($pattern), $this->_field);
         $query = new Zend_Search_Lucene_Search_Query_Wildcard($term);
         $query->setBoost($this->_boost);
         return $query;
     }
     $tokens = explode(" ", $this->_term);
     if (count($tokens) == 0) {
         return new Zend_Search_Lucene_Search_Query_Insignificant();
     }
     if (count($tokens) == 1 && !$this->_fuzzyQuery) {
         $term = new Zend_Search_Lucene_Index_Term(strtolower($tokens[0]), $this->_field);
         $query = new Zend_Search_Lucene_Search_Query_Term($term);
         $query->setBoost($this->_boost);
         return $query;
     }
     if (count($tokens) == 1 && $this->_fuzzyQuery) {
         $term = new Zend_Search_Lucene_Index_Term(strtolower($tokens[0]), $this->_field);
         $query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_similarity);
         $query->setBoost($this->_boost);
         return $query;
     }
     if ($this->_fuzzyQuery) {
         require_once __CA_LIB_DIR__ . '/core/Zend/Search/Lucene/Search/QueryParserException.php';
         throw new Zend_Search_Lucene_Search_QueryParserException('Fuzzy search is supported only for non-multiple word terms');
     }
     //It's not empty or one term query
     $query = new Zend_Search_Lucene_Search_Query_MultiTerm();
     foreach ($tokens as $token) {
         $term = new Zend_Search_Lucene_Index_Term(strtolower($token), $this->_field);
         $query->addTerm($term, true);
     }
     $query->setBoost($this->_boost);
     return $query;
 }
Ejemplo n.º 18
0
 public function getskillsAction()
 {
     $skills = $this->getRequest()->getParam('skills');
     //$this->view->result=$post;
     /**
      * Open index
      */
     $index = Search_MyLucene::open($this->_userindexPath);
     //$term=new Zend_search_lucene_i
     Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0);
     //$query = 'name:' . $post['name'];
     $query = 'skills:' . $skills . '*';
     $results = $index->find($query);
     $matches = array();
     foreach ($results as $values) {
         $string = explode(' ', $values->skills);
         foreach ($string as $str) {
             if (stripos($str, $skills) === 0) {
                 array_push($matches, strtolower($str));
             }
         }
     }
     $matches = array_unique($matches);
     $this->view->result = $matches;
 }