/** * @group functional */ public function testSearchByDocument() { $client = $this->_getClient(array('persistent' => false)); $index = $client->getIndex('elastica_test'); $index->create(array('index' => array('number_of_shards' => 1, 'number_of_replicas' => 0)), true); $type = new Type($index, 'mlt_test'); $type->addDocuments(array(new Document(1, array('visible' => true, 'name' => 'bruce wayne batman')), new Document(2, array('visible' => true, 'name' => 'bruce wayne')), new Document(3, array('visible' => false, 'name' => 'bruce wayne')), new Document(4, array('visible' => true, 'name' => 'batman')), new Document(5, array('visible' => false, 'name' => 'batman')), new Document(6, array('visible' => true, 'name' => 'superman')), new Document(7, array('visible' => true, 'name' => 'spiderman')))); $index->refresh(); $doc = $type->getDocument(1); // Return all similar $mltQuery = new MoreLikeThis(); $mltQuery->setMinTermFrequency(1); $mltQuery->setMinDocFrequency(1); $mltQuery->setLike($doc); $query = new Query($mltQuery); $resultSet = $type->search($query); $this->assertEquals(4, $resultSet->count()); $mltQuery = new MoreLikeThis(); $mltQuery->setMinTermFrequency(1); $mltQuery->setMinDocFrequency(1); $mltQuery->setLike($doc); $query = new Query\Filtered($mltQuery); // Return just the visible similar $filter = new BoolFilter(); $filterTerm = new Term(); $filterTerm->setTerm('visible', true); $filter->addMust($filterTerm); $query->setFilter($filter); $resultSet = $type->search($query); $this->assertEquals(2, $resultSet->count()); }
/** * @group unit * @expectedException \Elastica\Exception\InvalidException */ public function testAddShouldInvalidException() { $filter = new BoolFilter(); $filter->addShould('fail!'); }
/** * @param $appliedFilters * @param $elasticaQuery * * @return array */ public function applyFilterToElasticaQuery($appliedFilters, $elasticaQuery) { $rangeFilters = new BoolOr(); $boolFilter = new BoolFilter(); $filters = []; $termFilters = []; foreach ($appliedFilters as $facet) { if (strpos($facet[key($facet)], '|') !== false) { $filters[key($facet)][] = ['range' => explode('|', $facet[key($facet)])]; } else { $filters[key($facet)][] = $facet[key($facet)]; } } foreach ($filters as $name => $value) { if (is_array($value[0])) { foreach ($value as $range) { $rangeFilter = new FilterRange(); $rangeFilter->addField($name, ['gte' => $range['range'][0], 'lte' => $range['range'][1]]); $rangeFilters->addFilter($rangeFilter); } $boolFilter->addShould($rangeFilters); } else { $termFilters = new FilterTerms(); $termFilters->setTerms($name, $value); $boolFilter->addShould($termFilters); } } $elasticaQuery->setFilter($boolFilter); return [$termFilters, $rangeFilters, $boolFilter, $filters]; }
/** * getFilter * * @access private * @return AbstractFilter */ private function getFilter() { if (!$this->filterList) { return null; } if (count($this->filterList) == 1) { return current($this->filterList); } $boolFilters = []; $andFilters = []; foreach ($this->filterList as $tmpFilter) { if ($this->isAndFilter($tmpFilter)) { $andFilters[] = $tmpFilter; } else { $boolFilters[] = $tmpFilter; } } $boolFilter = null; $nbBoolFilters = count($boolFilters); if ($nbBoolFilters > 1) { $boolFilter = new Filter\BoolFilter(); foreach ($boolFilters as $tmpFilter) { $boolFilter->addMust($tmpFilter); } array_unshift($andFilters, $boolFilter); } elseif ($nbBoolFilters == 1) { $andFilters = array_merge($boolFilters, $andFilters); } $nbAndFilters = count($andFilters); if ($nbAndFilters == 1) { return current($andFilters); } elseif ($nbAndFilters > 1) { $filter = new Filter\BoolAnd(); $filter->setFilters($andFilters); return $filter; } return null; }