public function getQueryForSearch(ArticleSearch $articleSearch)
{
// we create a query to return all the articles
// but if the criteria title is specified, we use it
if ($articleSearch->getTitle() !== null && $articleSearch != '') {
$query = new \Elastica\Query\Match();
$query->setFieldQuery('article.title', $articleSearch->getTitle());
$query->setFieldFuzziness('article.title', 0.7);
$query->setFieldMinimumShouldMatch('article.title', '80%');
} else {
$query = new \Elastica\Query\MatchAll();
}
// then we create filters depending on the chosen criterias
$boolQuery = new \Elastica\Query\Bool();
$boolQuery->addMust($query);
/*
Dates filter
We add this filter only the ispublished filter is not at "false"
*/
if ("false" != $articleSearch->isPublished() && null !== $articleSearch->getDateFrom() && null !== $articleSearch->getDateTo()) {
$boolQuery->addMust(new \Elastica\Query\Range('publishedAt', array('gte' => \Elastica\Util::convertDate($articleSearch->getDateFrom()->getTimestamp()), 'lte' => \Elastica\Util::convertDate($articleSearch->getDateTo()->getTimestamp()))));
}
// Published or not filter
if ($articleSearch->isPublished() !== null) {
$boolQuery->addMust(new \Elastica\Query\Terms('published', array($articleSearch->isPublished())));
}
$query = new \Elastica\Query($boolQuery);
$query->setSort(array($articleSearch->getSort() => array('order' => $articleSearch->getDirection())));
return $query;
}