Symfony 对多索引搜索应用不同的筛选器
我正在使用FOSElasticaBundle和Symfony 3。我想在ES6中搜索不同的索引 我有两个实体狗,猫和一个字段名“所有者”(实体用户)。狗和猫有一个字段“name”(string),我想搜索每只狗,只搜索将其所有者设置为userId的猫 例如:Symfony 对多索引搜索应用不同的筛选器,symfony,foselasticabundle,Symfony,Foselasticabundle,我正在使用FOSElasticaBundle和Symfony 3。我想在ES6中搜索不同的索引 我有两个实体狗,猫和一个字段名“所有者”(实体用户)。狗和猫有一个字段“name”(string),我想搜索每只狗,只搜索将其所有者设置为userId的猫 例如: 用户:#1鲍勃 用户:#2查尔 猫:#1联阵,主人#1 猫:帕特,主人 狗:#1联阵 狗:#2拍 如果我是鲍勃,我写“联阵”。我想要结果猫1,狗1,但如果我写“帕特”,我想要结果狗2 弹力 fos_elastica: client
- 用户:#1鲍勃
- 用户:#2查尔
- 猫:#1联阵,主人#1
- 猫:帕特,主人
- 狗:#1联阵
- 狗:#2拍
fos_elastica:
clients:
default:
host: %elastic_host%
port: %elastic_port%
indexes:
dog:
finder: ~
client: default
types:
dog:
indexable_callback: 'getEnabled'
properties:
id:
type: integer
name: ~
persistence:
driver: orm
model: AppBundle\Entity\Dog
finder: ~
elastica_to_model_transformer:
ignore_missing: true
cat:
finder: ~
client: default
types:
cat:
indexable_callback: 'getEnabled'
properties:
name: ~
owner:
type: "object"
properties:
id: integer
persistence:
driver: orm
model: AppBundle\Entity\Cat
finder: ~
elastica_to_model_transformer:
ignore_missing: true
我正在使用以下方法在ES中搜索:
public function search(User $user, $query)
{
$search = $this->indexManager->getIndex('dog')->createSearch();
$search->addIndex('cat');
$search->addType('dog');
$search->addType('cat');
$resultSet = $search->search($query);
return $this->formatResult($resultSet);
}
我如何进行搜索?我应该在Cat上使用过滤器吗?每个索引可以使用一个存储库吗 我会做两个单独的搜索,每个索引一个。如果需要单个查询进行分页,那么我将直接使用ElasticSearchAPI,因为我不确定FosElasticaBundle是否支持这种搜索。
您可以在ES api的using Curl调用中找到如何进行多索引搜索。您可以使用ruflin/elastica使用多个索引进行搜索。 可能是这样的:
$search = new Elastica\Search($client);
$search->addIndex('dog')->addIndex('cat');
try {
$searchResponse = $search->search($q);
return $searchResponse->getResults();
} catch (ResponseException $exception) {
return [];
}
很抱歉,我不知道如何使用FOSElasticaBundle执行此操作。finder应按所有索引进行搜索:
@fos\u elastica.finder.app
查询结果如下所示:
$boolQuery = new \Elastica\Query\BoolQuery();
/*****************DOG PART**********************/
$dogBoolQuery = new \Elastica\Query\BoolQuery();
$dogNameMatchQuery = new \Elastica\Query\Term();
$dogNameMatchQuery->setTerm('name', $query);
$dogTypeFilter = new \Elastica\Query\Type();
$dogTypeFilter->setType('dog');
$dogBoolQuery->addMust($dogNameMatchQuery);
$dogBoolQuery->addFilter($dogTypeFilter);
/***************************************/
/*****************CAT PART**********************/
$catBoolQuery = new \Elastica\Query\BoolQuery();
$catTypeFilter = new \Elastica\Query\Type();
$catTypeFilter->setType('cat');
$ownerNameTermQuery = new \Elastica\Query\Term();
$ownerNameTermQuery->setTerm('id', $user->getId());
$ownerQuery = new \Elastica\Query\HasParent($ownerNameTermQuery, 'owner');
$catBoolQuery->addFilter($catTypeFilter);
$catBoolQuery->addFilter($ownerQuery);
/***************************************/
$boolQuery->addShould($dogBoolQuery);
$boolQuery->addShould($catBoolQuery);
$searchQuery = new \Elastica\Query();
$searchQuery->setQuery($boolQuery);
$results = $this->finder->find($searchQuery);