使用Foselastica捆绑包一次搜索多种类型



我们有一个延伸FOSElasticaBundleRepository的现有类,并且在查找页面对象方面做得很好,这要归功于此YML:

        types:
            snapshot:
                mappings:
                    ignore_in_teaser_automatic:
                        type: boolean
                    publication_date_start:
                        type: date
                    publication_date_end:
                        type: date
                    page:
                        type: object
                        properties:
                        ...

...和此php:

    if ($limit === null) {
        $limit = 1000;
    }
    $script = new Script('floor(_score * 100)');
    $script->setLang('expression');
    // Recalculate score and adjust it to apply sorting by score
    $baseQuery = new QueryFunctionScore();
    $baseQuery->addScriptScoreFunction($script)
        ->setBoostMode(QueryFunctionScore::BOOST_MODE_REPLACE);

    $boolFilter = $this->getPublishBoolFilter();
    if (!empty($query)) {
        $matchQuery = new QueryMultiMatch();
        $matchQuery->setQuery($query)
            ->setFields([
                '_all',
                'page.title^20',
            ])
            ->setType(QueryMultiMatch::TYPE_MOST_FIELDS)
            ->setMinimumShouldMatch('45%')
        ;
        $boolFilter->addMust($matchQuery);
    }
    if (null !== $pageType) {
        $this->addPageTypeFilter($boolFilter, $pageType);
    }
    if ($filter instanceof Collection) {
        $this->addCollectionFilter($boolFilter, $filter);
    }
    if (is_numeric($filter)) {
        $this->addYearFilter($boolFilter, $filter);
    }
    $this->addSiteFilter($boolFilter, $site);
    $baseQuery->setQuery($boolFilter);
    $query = new Query();
    $query->setQuery($baseQuery);
    $query->setSort(
        array_merge(
            ['_score' => 'desc'],
            $order,
            self::getDefaultSortParams()
        )
    );

    return $this->find($query, $limit, $options);

...这给了我一系列纯php快照对象。好。

现在,我想添加第二个对象类型的匹配项-ViginsCompany。我添加一些YML ...

            traffic_company:
                properties:
                    name: ~
                    description: ~
                persistence:
                    driver: orm
                    model: AppBundleEntityTrafficCompany
                    provider: ~
                    finder: ~

...我相应地修改了我的php ...

            ...
            ->setType(QueryMultiMatch::TYPE_MOST_FIELDS)
            ->addType('traffic_company') //Does not seem to do anything useful. We still get exclusively Snapshot objects back.
            ->setMinimumShouldMatch('45%')
            ...

...但是我现在有一个错误。

试图调用一个名为" AddType"的未定义方法 " Elastica Query Multimatch"

我还尝试了几个变体。是否有一种简单的方法可以将我的新对象类型添加到结果?

有一种方法可以将多种类型的结果带入一个查询中:

https://github.com/friendsofsymfony/foselasticabundle/blob/master/doc/cookbook/multi-type-search.md

如果链接死亡,这是他们使用的代码:

$query = 'search-string';
$mngr = $this->get('fos_elastica.index_manager');
$search = $mngr->getIndex('app')->createSearch();
$search->addType('article');
$search->addType('news');
$resultSet = $search->search($query);
$transformer = $this->get('fos_elastica.elastica_to_model_transformer.collection.app');
$results = $transformer->transform($resultSet->getResults());

关键是在控制器(或服务中(中执行此操作,而不是在存储库中进行操作。

===

编辑:解决此问题的另一种方法是进行三个查询,但使用findHybrid()返回结果和排名数据。这最终就是我所做的:我有三个单独的存储库,每个存储库都来自findHybrid()。然后,在控制器中,我使用array_merge()usort()功能合并数据并按得分进行排序。

相关内容

  • 没有找到相关文章

最新更新