public function testBooleanQuery() { $objSearchTerm1 = new class_module_search_term("hallo"); $objSearchTerm2 = new class_module_search_term("welt"); $objBooleanSearch = new class_module_search_boolean_query(); $objBooleanSearch->add($objSearchTerm1, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_MUST); $objBooleanSearch->add($objSearchTerm2, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_MUST); $arrResult = $this->getResultsFromQuery($objBooleanSearch); $this->assertEquals(count($arrResult), 2); $this->assertEquals($arrResult[0]["score"], 2); $this->assertEquals($this->getCountFromQuery($objBooleanSearch), 2); // One more optional search term $objSearchTerm3 = new class_module_search_term("blub"); $objBooleanSearch->add($objSearchTerm3, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_SHOULD); $arrResult = $this->getResultsFromQuery($objBooleanSearch); $this->assertEquals(count($arrResult), 2); $this->assertEquals($arrResult[0]["score"], 4); $this->assertEquals($arrResult[1]["score"], 2); $this->assertEquals($this->getCountFromQuery($objBooleanSearch), 2); // Module metadata filter $objMetadataFilter = new class_module_search_metadata_filter(); $objMetadataFilter->setFilterModules(array(_system_modul_id_)); $objBooleanSearch->setMetadataFilter($objMetadataFilter); $arrResult = $this->getResultsFromQuery($objBooleanSearch); $this->assertEquals(count($arrResult), 1, "Metadata module filter"); $this->assertEquals($arrResult[0]["score"], 4); $this->assertEquals($this->getCountFromQuery($objBooleanSearch), 1); $objMetadataFilter->setFilterModules(array(_system_modul_id_, _search_module_id_)); $objBooleanSearch->setMetadataFilter($objMetadataFilter); $arrResult = $this->getResultsFromQuery($objBooleanSearch); $this->assertEquals(count($arrResult), 2, "Metadata module filter"); $this->assertEquals($this->getCountFromQuery($objBooleanSearch), 2); // must must mustNot Search $objParser = new class_module_search_query_parser(); $objQuery = $objParser->parseText("+hallo +welt -blub"); $arrResult = $this->getResultsFromQuery($objQuery); $this->assertEquals(count($arrResult), 1); $this->assertEquals($this->getCountFromQuery($objQuery), 1); $objParser = new class_module_search_query_parser(); $objQuery = $objParser->parseText("+hallo +subtitle:blub"); $arrResult = $this->getResultsFromQuery($objQuery); $this->assertEquals(count($arrResult), 1); $this->assertEquals($arrResult[0]["score"], 2, "field filter scoring"); $this->assertEquals($this->getCountFromQuery($objQuery), 1); $objQuery = $objParser->parseText("title:hallo"); $arrResult = $this->getResultsFromQuery($objQuery); $this->assertEquals(count($arrResult), 2); $this->assertEquals($arrResult[0]["score"], 1, "field filter scoring"); $this->assertEquals($this->getCountFromQuery($objQuery), 2); //test new Scoring $objQuery = $objParser->parseText("lorem ipsum"); $arrResult = $this->getResultsFromQuery($objQuery); $this->assertEquals(count($arrResult), 1); $this->assertEquals($arrResult[0]["score"], 4, "'lorem ipsum' scoring"); $this->assertEquals($this->getCountFromQuery($objQuery), 1); }
/** * @param string $strSearchQuery * @return interface_search_query */ public function parseText($strSearchQuery) { $arrHits = array(); preg_match_all('/(?<must>[+-]?)(?<field>\\w{1,}(?<semperator>:)){0,1}(?<term>\\w{1,})/u', $strSearchQuery, $arrHits, PREG_SET_ORDER); if (count($arrHits) == 1) { $objSearchQuery = new class_module_search_term_query(new class_module_search_term(str_replace(":", "", $arrHits[0]['term']), substr($arrHits[0]['field'], 0, -1))); return $objSearchQuery; } if (count($arrHits) > 1) { $objSearchQuery = new class_module_search_boolean_query(); $arrMusts = array(); $arrMustNots = array(); $arrNoOperators = array(); foreach ($arrHits as $arrHit) { $objTerm = new class_module_search_term(str_replace(":", "", $arrHit['term']), substr($arrHit['field'], 0, -1)); switch ($arrHit['must']) { case "+": $arrMusts[] = $objTerm; break; case "-": $arrMustNots[] = $objTerm; break; case "": $arrNoOperators[] = $objTerm; break; } } /** @var $objTerm class_module_search_term */ foreach ($arrMusts as $objTerm) { $objSearchQuery->add($objTerm, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_MUST); } /** @var $objTerm class_module_search_term */ foreach ($arrMustNots as $objTerm) { $objSearchQuery->add($objTerm, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_MUST_NOT); } if (count($arrMusts) > 0) { foreach ($arrNoOperators as $objTerm) { $objSearchQuery->add($objTerm, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_SHOULD); } } elseif (count($arrMustNots) > 0 || count($arrMusts) == 0 && count($arrMustNots) == 0) { foreach ($arrNoOperators as $objTerm) { $objSearchQuery->add($objTerm, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_MUST); } } return $objSearchQuery; } return null; }