public function execute() { $baseName = $this->getOption('baseName', wfWikiId()); if ($this->hasOption('show-all')) { $this->show(); } elseif ($this->hasOption('update')) { $this->update($baseName); } else { $filter = new \Elastica\Filter\BoolOr(); foreach ($this->getConnection()->getAllIndexTypes() as $type) { $term = new \Elastica\Filter\Term(); $term->setTerm('_id', $this->getConnection()->getIndexName($baseName, $type)); $filter->addFilter($term); } $this->show($filter); } }
public function search(SiteSearch $siteSearch) { // We create a query to return all the articles but if the criteria text is specified, we use it if ($siteSearch->getText() != null && $siteSearch != '') { $baseQuery = new \Elastica\Query\MultiMatch(); $baseQuery->setQuery($siteSearch->getText())->setFields(array('title', 'subtitle', 'courseContent', 'content')); $baseQuery->setFuzziness(0.7); $baseQuery->setMinimumShouldMatch('80%'); } else { $baseQuery = new \Elastica\Query\MatchAll(); } // Then we create filters depending on the chosen criterias // Filter courses only if type is not "product" $productTypeFilter = new \Elastica\Filter\Type(); $productTypeFilter->setType('product'); $productNotFilter = new \Elastica\Filter\BoolNot($productTypeFilter); // Filter for products with available courses $nestedFilter = new \Elastica\Filter\Nested(); $nestedFilter->setPath('courses'); $nestedFilter->setQuery(new \Elastica\Query\Range('beginDate', array('gte' => \Elastica\Util::convertDate((new \DateTime())->getTimestamp())))); // Filter not(products) OR products with available courses $orFilter = new \Elastica\Filter\BoolOr(); $orFilter->addFilter($productNotFilter); $orFilter->addFilter($nestedFilter); // Create a bool filter to put everything together $boolFilter = new \Elastica\Filter\Bool(); $boolFilter->addMust($orFilter); // Filter type if ($siteSearch->getIsProduct() || $siteSearch->getIsInfoEvent() || $siteSearch->getIsContent()) { // Create OR filter to put together the types $typeOrFilter = new \Elastica\Filter\BoolOr(); // Filter products if ($siteSearch->getIsProduct()) { $productAndFilter = new \Elastica\Filter\BoolAnd(); $productAndFilter->addFilter($productTypeFilter); $infoFilter = new \Elastica\Filter\Term(array('infoVa' => false)); $productAndFilter->addFilter($infoFilter); $typeOrFilter->addFilter($productAndFilter); } // Filter info events if isProduct is not selected if ($siteSearch->getIsInfoEvent()) { $productAndFilter = new \Elastica\Filter\BoolAnd(); $productAndFilter->addFilter($productTypeFilter); $infoFilter = new \Elastica\Filter\Term(array('infoVa' => true)); $productAndFilter->addFilter($infoFilter); $typeOrFilter->addFilter($productAndFilter); } // Filter content if ($siteSearch->getIsContent()) { $typeOrFilter->addFilter($productNotFilter); } $boolFilter->addMust($typeOrFilter); } // Filter product type if ($siteSearch->getProductType()) { $productTypeFilter = new \Elastica\Filter\Nested(); $productTypeFilter->setPath('productType'); $productTypeFilter->setFilter(new \Elastica\Filter\Term(array('productType._id' => $siteSearch->getProductType()->getId()))); $boolFilter->addMust($productTypeFilter); } // Filter day time if ($siteSearch->getDayTime()) { $dayTimeFilter = new \Elastica\Filter\Nested(); $dayTimeFilter->setPath('courses'); $dayTimeFilter->setFilter(new \Elastica\Filter\Term(array('courses.dayTimes' => $siteSearch->getDayTime()))); $boolFilter->addMust($dayTimeFilter); } // Filter category if ($siteSearch->getCategory()) { $categoryFilter = new \Elastica\Filter\BoolOr(); $mainCategoryFilter = new \Elastica\Filter\Nested(); $mainCategoryFilter->setPath('category'); $mainCategoryFilter->setFilter(new \Elastica\Filter\Term(array('category._id' => $siteSearch->getCategory()->getId()))); $subCategoryFilter = new \Elastica\Filter\Nested(); $subCategoryFilter->setPath('subcategory'); $subCategoryFilter->setFilter(new \Elastica\Filter\Term(array('subcategory._id' => $siteSearch->getCategory()->getId()))); $additionalCategoryFilter = new \Elastica\Filter\Nested(); $additionalCategoryFilter->setPath('additionalCategories'); $additionalCategoryFilter->setFilter(new \Elastica\Filter\Term(array('additionalCategories._id' => $siteSearch->getCategory()->getId()))); $categoryFilter->addFilter($mainCategoryFilter); $categoryFilter->addFilter($subCategoryFilter); $categoryFilter->addFilter($additionalCategoryFilter); $boolFilter->addMust($categoryFilter); } $filtered = new \Elastica\Query\Filtered($baseQuery, $boolFilter); $query = \Elastica\Query::create($filtered); $sort = $siteSearch->getSort(); if (!empty($sort)) { $sort = explode(' ', $sort); $query->setSort(array($sort[0] => array('order' => $sort[1]), "_score" => array('order' => 'desc'))); } $paginated = $this->finder->findPaginated($query); $paginated->setMaxPerPage($siteSearch->getPerPage())->setCurrentPage($siteSearch->getPage()); return $paginated; }
/** * @param $appliedFilters * @param $elasticaQuery * * @return array */ public function applyFilterToElasticaQuery($appliedFilters, $elasticaQuery) { $rangeFilters = new \Elastica\Filter\BoolOr(); $boolFilter = new \Elastica\Filter\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 \Elastica\Filter\Range(); $rangeFilter->addField($name, ['gte' => $range['range'][0], 'lte' => $range['range'][1]]); $rangeFilters->addFilter($rangeFilter); } $boolFilter->addShould($rangeFilters); } else { $termFilters = new \Elastica\Filter\Terms(); $termFilters->setTerms($name, $value); $boolFilter->addShould($termFilters); } } $elasticaQuery->setFilter($boolFilter); return [$termFilters, $rangeFilters, $boolFilter, $filters]; }
/** * @SWG\Api( * path="/posts/search", * @SWG\Operation( * method="POST", * summary="Search items in posts", * nickname="posts_search", * @SWG\Parameter( * name="post_type", * required=false, * type="string" * ), * @SWG\Parameter( * name="filters", * description="filter values, eg. [{my_parameter: 'mustmatchthis'}] * required=false, * type="array[]" * ), * @SWG\Parameter( * name="search_phrase", * required=false, * type="string" * ), * @SWG\Parameter( * name="sort", * description="sort configuration, eg [{'post_name':{'order':'asc'}}]", * required=false, * type="array[]" * ), * @SWG\Parameter( * name="limit", * description="Max number of documents in return", * required=false, * type="integer" * ) * ) * ) */ function search() { $result = array(); $body = $this->getBodyAsArray(); $required_parameters = array(); $optional_parameters = array('post_type', 'filters', 'search_phrase', 'sort', 'limit', 'size', 'from'); $this->check_req_opt_param($required_parameters, $optional_parameters, $body); $index = $this->elastica->getIndex($this->getElasticsearchIndex()); $query = new \Elastica\Query(); $boolean = new \Elastica\Query\Bool(); $added = false; $type = isset($body['post_type']) ? $body['post_type'] : null; if ($type) { $q = new \Elastica\Query\Term(array('_type' => $type)); $boolean->addMust($q); $added = true; } $filters = isset($body['filters']) ? (array) $body['filters'] : array(); $filters = array_filter($filters); $filterAnd = ''; if ($filters) { foreach ($filters as $key => $vals) { if (!is_array($vals)) { $vals = array($vals); } if (strpos(implode('', $vals), '*')) { foreach ($vals as $val) { $extraQuery = new \Elastica\Query\SimpleQueryString($val, array($key)); $boolean->addMust($extraQuery); } } else { $filterOr = new \Elastica\Filter\BoolOr(); foreach ($vals as $val) { $filter = new \Elastica\Filter\Term(); $filter->setTerm($key, $val); $filterOr->addFilter($filter); } if (!$filterAnd) { $filterAnd = new \Elastica\Filter\BoolAnd(); } $filterAnd->addFilter($filterOr); } } } $search_phrase = isset($body['search_phrase']) ? $body['search_phrase'] : null; if (isset($search_phrase) && !empty($search_phrase)) { $word = strtolower($search_phrase) . '*'; $elasticaQueryString = new \Elastica\Query\SimpleQueryString($word); $boolean->addMust($elasticaQueryString); $added = true; } if ($added) { $query->setQuery($boolean); } if ($filterAnd) { $query->setPostFilter($filterAnd); } $limit = isset($body['limit']) ? (int) $body['limit'] : null; if ($limit) { $query->setSize($limit); } $sort = isset($body['sort']) ? (array) $body['sort'] : null; if ($sort) { $query->setSort($sort); // example: array( 'post_date' => array( 'order' => 'desc' ) ) } $body['from'] = isset($body['from']) && $body['from'] ? $body['from'] : 0; $body['size'] = isset($body['size']) && $body['size'] ? $body['size'] : 1000; $elasticaResultSet = $index->search($query, ['from' => $body['from'], 'size' => $body['size']]); foreach ($elasticaResultSet->getResults() as $elasticaResult) { $result[] = $elasticaResult->getData(); } echo json_encode(array('hits' => $result, 'count' => $index->count($query))); }
/** * @return Hackathon_ElasticgentoCore_Model_Resource_Collection */ protected function _renderFiltersBefore() { //apply category filters if (true === isset($this->_productLimitationFilters['category_id']) && (int) $this->_productLimitationFilters['category_id'] > 0) { //check if category is anchor if (false === isset($this->_productLimitationFilters['category_is_anchor'])) { $filter = new Elastica\Filter\BoolOr(); $filterAnchors = new Elastica\Filter\Term(); $filterAnchors->setTerm('anchors', $this->_productLimitationFilters['category_id']); } $filterCategory = new Elastica\Filter\Term(); $filterCategory->setTerm('categories', $this->_productLimitationFilters['category_id']); if (false === isset($this->_productLimitationFilters['category_is_anchor'])) { $filter->addFilter($filterCategory); $filter->addFilter($filterAnchors); $filter->setName('category'); $this->_queryAttributeFilters['category'] = $filter; } else { $filterCategory->setName('category'); $this->_queryAttributeFilters['category'] = $filterCategory; } } //apply visibility filters if (true === isset($this->_productLimitationFilters['visibility'])) { if (true === is_array($this->_productLimitationFilters['visibility'])) { $visibilityFilters = new Elastica\Filter\BoolOr(); foreach ($this->_productLimitationFilters['visibility'] as $visibility) { $visibilityFilter = new Elastica\Filter\Term(); $visibilityFilter->setTerm('visibility', $visibility); $visibilityFilters->addFilter($visibilityFilter); } $visibilityFilters->setName('visibility'); $this->_queryAttributeFilters['visibility'] = $visibilityFilters; } } return parent::_renderFiltersBefore(); }
public function search(Category $currentCategory, CategorySearch $categorySearch) { // We create a query to return all the products $baseQuery = new \Elastica\Query\MatchAll(); // Then we create filters depending on the chosen criterias // Filter products $productTypeFilter = new \Elastica\Filter\Type(); $productTypeFilter->setType('product'); // Filter for products with available courses $nestedFilter = new \Elastica\Filter\Nested(); $nestedFilter->setPath('courses'); $nestedFilter->setQuery(new \Elastica\Query\Range('beginDate', array('gte' => \Elastica\Util::convertDate((new \DateTime())->getTimestamp())))); // Create a bool filter to put everything together $boolFilter = new \Elastica\Filter\Bool(); $boolFilter->addMust($productTypeFilter); $boolFilter->addMust($nestedFilter); // Show only products // Filter type if ($categorySearch->getIsProduct() || $categorySearch->getIsInfoEvent()) { // Create OR filter to put together the types $typeOrFilter = new \Elastica\Filter\BoolOr(); // Filter products if ($categorySearch->getIsProduct()) { $productAndFilter = new \Elastica\Filter\BoolAnd(); $productAndFilter->addFilter($productTypeFilter); $infoFilter = new \Elastica\Filter\Term(array('infoVa' => false)); $productAndFilter->addFilter($infoFilter); $typeOrFilter->addFilter($productAndFilter); } // Filter info events if isProduct is not selected if ($categorySearch->getIsInfoEvent()) { $productAndFilter = new \Elastica\Filter\BoolAnd(); $productAndFilter->addFilter($productTypeFilter); $infoFilter = new \Elastica\Filter\Term(array('infoVa' => true)); $productAndFilter->addFilter($infoFilter); $typeOrFilter->addFilter($productAndFilter); } $boolFilter->addMust($typeOrFilter); } // Filter product type if ($categorySearch->getProductType()) { $productTypeFilter = new \Elastica\Filter\Nested(); $productTypeFilter->setPath('productType'); $productTypeFilter->setFilter(new \Elastica\Filter\Term(array('productType._id' => $categorySearch->getProductType()->getId()))); $boolFilter->addMust($productTypeFilter); } // Filter day time if ($categorySearch->getDayTime()) { $dayTimeFilter = new \Elastica\Filter\Nested(); $dayTimeFilter->setPath('courses'); $dayTimeFilter->setFilter(new \Elastica\Filter\Term(array('courses.dayTimes' => $categorySearch->getDayTime()))); $boolFilter->addMust($dayTimeFilter); } // Filter categories $categoryIds = array(); if ($categorySearch->getSubcategories() instanceof \Traversable) { foreach ($categorySearch->getSubcategories() as $category) { if (is_object($category)) { $categoryIds[] = $category->getId(); } else { $categoryIds[] = $category; } } } if (empty($categoryIds)) { $categoryIds[] = $currentCategory->getId(); foreach ($currentCategory->getChildren() as $child) { $categoryIds[] = $child->getId(); } } $categoryFilter = new \Elastica\Filter\BoolOr(); $mainCategoryFilter = new \Elastica\Filter\Nested(); $mainCategoryFilter->setPath('category'); $mainCategoryFilter->setFilter(new \Elastica\Filter\Terms('category._id', array($categoryIds))); $subCategoryFilter = new \Elastica\Filter\Nested(); $subCategoryFilter->setPath('subcategory'); $subCategoryFilter->setFilter(new \Elastica\Filter\Terms('subcategory._id', array($categoryIds))); $additionalCategoryFilter = new \Elastica\Filter\Nested(); $additionalCategoryFilter->setPath('additionalCategories'); $additionalCategoryFilter->setFilter(new \Elastica\Filter\Terms('additionalCategories._id', array($categoryIds))); $categoryFilter->addFilter($mainCategoryFilter); $categoryFilter->addFilter($subCategoryFilter); $categoryFilter->addFilter($additionalCategoryFilter); $boolFilter->addMust($categoryFilter); $filtered = new \Elastica\Query\Filtered($baseQuery, $boolFilter); $query = \Elastica\Query::create($filtered); $sort = $categorySearch->getSort(); if (!empty($sort)) { $sort = explode(' ', $sort); $query->setSort(array($sort[0] => array('order' => $sort[1]), "_score" => array('order' => 'desc'))); } $paginated = $this->finder->findPaginated($query); $paginated->setMaxPerPage($categorySearch->getPerPage())->setCurrentPage($categorySearch->getPage()); return $paginated; }