我正在使用FOSElasticaBundle和Symfony 3.我想在ES6中搜索不同的索引。
我有两个实体狗,猫有一个字段名称"所有者" (实体用户)。狗和猫有一个领域"名称" (字符串),我想搜索每只狗,只有那些拥有它的所有者设置在userId。
示例:
如果我是鲍勃,我会写" Ruf"。我希望结果是Cat#1,狗#1,但如果我写'#34; Pat",我想结果狗#2。
elastica.yml
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上使用过滤器吗?我能为每个索引使用一个存储库吗?
答案 0 :(得分:0)
您可以使用ruflin / elastica使用多个索引进行搜索。 它会是这样的:
{{1}}
对不起,我不知道如何用FOSElasticaBundle做到这一点。
答案 1 :(得分:0)
finder应该搜索所有索引:
@fos_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);
答案 2 :(得分:-1)
我会进行两次单独的搜索,每次搜索一次。如果您需要单个查询以进行分页,那么我将直接使用Elasticsearch api,因为我不确定FosElasticaBundle是否支持这种搜索。 您可以使用对ES api的Curl调用,在Elasticsearch documentation中找到如何进行多索引搜索。