Используйте эластику с PagerFanta и динамическим конструктором запросов

У меня есть приложение с symfony2/doctor 2/elastica/fosElasticaBundle/pagerFanta.

Я хочу использовать пользовательский и динамический queryBuilder в сочетании с pagerfanta и elastica. Не преобразовывать результаты, а предварительно фильтровать их.

До сих пор мне удавалось: 1. Использовать pagerfanta отдельно с моим пользовательским queryBuilder:

    $page = $request->get('page', 1);
    $search = $request->get('search');
    $querybuilder = $this->getDoctrine()->getRepository('AppBundle:FoodAnalytics\Recipe')->findByTopCategoryQueryBuilder($category);
    $explorerManager = $this->get('explorer_manager');
    $pagerFanta = $explorerManager->getPagerFanta($querybuilder, $page, 4);
    $recipes = $pagerFanta->getCurrentPageResults();
  1. Используйте Elastica с Pagerfanta, но без моего пользовательского QueryBuilder:

    $page = $request->get('page', 1);
    $search = $request->get('search');
    $finder = $this->container->get('fos_elastica.finder.website.recipe');
    $pagerFanta = $finder->findPaginated($search);
    $recipes = $pagerFanta->getCurrentPageResults();
    

Теперь, как я могу использовать свой собственный QueryBuilder? Я знаю, что вы можете установить собственный в конфигурации elastica, но мой должен быть динамическим = принимать аргумент, поэтому я хотел бы установить его в контроллере. Это возможно ?


person Sébastien    schedule 20.02.2015    source источник


Ответы (1)


Вы можете передать пользовательский метод Elastica\Query в findPaginated:

$query = new \Elastica\Query::create(new \Elastica\Query\Term(array(
    'name' => $request->get('search')
));
$finder = $this->container->get('fos_elastica.finder.website.recipe');
$pagerFanta = $finder->findPaginated($query);
$recipes = $pagerFanta->getCurrentPageResults();

Возможно, код станет более понятным, и вы сможете увидеть, как он работает, если использовать просто PagerFanta с ElasticaAdapter без FOSElasticaBundle. :

// Searchable can be any valid searchable Elastica object. For example a Type or Index
$finder = new \Elastica\Index($elasticaClient, 'website.recipe');
// A Query can be any valid Elastica query (json, array, Query object)
$query = new \Elastica\Query::create(new \Elastica\Query\Term(array(
    'name' => $request->get('search')
));

$elasticaAdapter = new \Pagerfanta\Adapter\ElasticaAdapter($finder, $query);
$paginator = new \Pagerfanta\Pagerfanta($elasticaAdapter);
$results = $paginator
                ->setMaxPerPage($limit)
                ->setCurrentPage($page)
                ->getCurrentPageResults();
person Zdeněk Drahoš    schedule 20.02.2015
comment
хммм, я так понимаю, вы используете pagerfanta для разбиения на страницы запроса elastica. но мой вопрос касается использования пользовательской доктрины queryBuilder в сочетании с этими двумя. это вообще возможно? - person Sébastien; 22.02.2015
comment
Я так не думаю. Но QueryBuilder и Elastica\Query — похожие абстракции. QueryBuilder используется для Doctrine (запрос SQL), Elastica\Query для ElasticSearch (запрос JSON). AFAIK ElasticSearch не поддерживает запросы SQL. - person Zdeněk Drahoš; 23.02.2015