/** * Convenient helper for building Bool filters. * @param AbstractFilter|array(AbstractFilter) $must must filters * @param AbstractFilter|array(AbstractFilter) $mustNot must not filters * @return Bool a bool filter containing $must and $mustNot */ private static function newBool($must, $mustNot) { $bool = new Bool(); if (is_array($must)) { foreach ($must as $m) { $bool->addMust($m); } } else { $bool->addMust($must); } if (is_array($mustNot)) { foreach ($mustNot as $m) { $bool->addMustNot($m); } } else { $bool->addMustNot($mustNot); } return $bool; }
public function testBoolFilter() { $index = $this->_createIndex('bool_filter_test'); $type = $index->getType('book'); //index some test data $type->addDocument(new \Elastica\Document(1, array('author' => 'Michael Shermer', 'title' => 'The Believing Brain', 'publisher' => 'Robinson'))); $type->addDocument(new \Elastica\Document(2, array('author' => 'Jared Diamond', 'title' => 'Guns, Germs and Steel', 'publisher' => 'Vintage'))); $type->addDocument(new \Elastica\Document(3, array('author' => 'Jared Diamond', 'title' => 'Collapse', 'publisher' => 'Penguin'))); $type->addDocument(new \Elastica\Document(4, array('author' => 'Richard Dawkins', 'title' => 'The Selfish Gene', 'publisher' => 'OUP Oxford'))); $type->addDocument(new \Elastica\Document(5, array('author' => 'Anthony Burges', 'title' => 'A Clockwork Orange', 'publisher' => 'Penguin'))); $index->refresh(); //use the terms lookup feature to query for some data //build query //must // should // author = jared // author = richard // must_not // publisher = penguin //construct the query $query = new Query(); $mainBoolFilter = new Bool(); $shouldFilter = new Bool(); $authorFilter1 = new Term(); $authorFilter1->setTerm('author', 'jared'); $authorFilter2 = new Term(); $authorFilter2->setTerm('author', 'richard'); $shouldFilter->addShould(array($authorFilter1, $authorFilter2)); $mustNotFilter = new Bool(); $publisherFilter = new Term(); $publisherFilter->setTerm('publisher', 'penguin'); $mustNotFilter->addMustNot($publisherFilter); $mainBoolFilter->addMust(array($shouldFilter, $mustNotFilter)); $query->setFilter($mainBoolFilter); //execute the query $results = $index->search($query); //check the number of results $this->assertEquals($results->count(), 2, 'Bool filter with child Bool filters: number of results check'); //count compare the id's $ids = array(); /** @var \Elastica\Result $result **/ foreach ($results as $result) { $ids[] = $result->getId(); } $this->assertEquals($ids, array("2", "4"), 'Bool filter with child Bool filters: result ID check'); $index->delete(); }
/** * Unify non-script filters into a single filter. * @param array(\Elastica\AbstractFilter) $must filters that must be found * @param array(\Elastica\AbstractFilter) $mustNot filters that must not be found * @return null|\Elastica\AbstractFilter null if there are no filters or one that will execute * all of the provided filters */ private static function unifyNonScript($mustFilters, $mustNotFilters) { $mustFilterCount = count($mustFilters); $mustNotFilterCount = count($mustNotFilters); if ($mustFilterCount + $mustNotFilterCount === 0) { return null; } if ($mustFilterCount === 1 && $mustNotFilterCount == 0) { return $mustFilters[0]; } if ($mustFilterCount === 0 && $mustNotFilterCount == 1) { return new \Elastica\Filter\BoolNot($mustNotFilters[0]); } $boolFilter = new \Elastica\Filter\Bool(); foreach ($mustFilters as $must) { $boolFilter->addMust($must); } foreach ($mustNotFilters as $mustNot) { $boolFilter->addMustNot($mustNot); } return $boolFilter; }