【问题标题】:Use elastica with PagerFanta and dynamic querybuilder将 elastica 与 PagerFanta 和动态查询构建器一起使用
【发布时间】:2015-02-20 17:38:03
【问题描述】:

我有一个带有 symfony2 / 学说 2 / elastica / fosElasticaBundle / pagerFanta 的应用程序。

我想结合 pagerfanta 和 elastica 使用自定义和动态 queryBuilder。不是对结果进行转换,而是对它们进行预过滤。

到目前为止,我能够: 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 配置中设置一个自定义的,但我的必须是动态的 = 带一个参数,所以我想在控制器中设置它。这可能吗?

【问题讨论】:

    标签: symfony doctrine-orm elasticsearch foselasticabundle pagerfanta


    【解决方案1】:

    你可以pass custom Elastica\Query to 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 with 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();
    

    【讨论】:

    • 嗯,我知道您使用 pagerfanta 对弹性查询进行分页。但我的问题是关于使用与这两者相关的自定义学说 queryBuilder。这有可能吗?
    • 我不这么认为。但是 QueryBuilder 和 Elastica\Query 是类似的抽象。 QueryBuilder 用于 Doctrine(SQL 查询),Elastica\Query 用于 ElasticSearch(JSON 查询)。 AFAIK ElasticSearch 不支持 SQL 查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2020-02-26
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多