我们有一个延伸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()
功能合并数据并按得分进行排序。