我使用FOSElasticaBundle和Symfony 3,我想在ES6中搜索不同的索引。
我有两个实体狗,猫的字段名“所有者”(实体用户)。狗和猫有一个字段“名称”(字符串),我想搜索每只狗,只有猫的主人设置在userId。
示例:
如果我是鲍勃,我会写“鲁夫”。我想要结果Cat#1,Dog#1,但是如果我写"Pat",我想要结果Dog#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);
}
我怎么做我的搜索?我应该在猫上使用过滤器吗?每个索引可以使用一个存储库吗?
发布于 2017-11-27 04:08:26
可以使用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。
发布于 2018-05-29 04:13:18
查找器应按所有索引进行搜索:@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);
发布于 2017-11-26 22:48:18
我会做两个单独的搜索,每个索引一个。如果为了分页目的需要一个查询,那么我将直接使用Elasticsearch,因为我不确定FosElasticaBundle是否支持这种搜索。您可以找到如何使用对ES的Curl调用在Elasticsearch文档中进行多个索引搜索。
https://stackoverflow.com/questions/47500272
复制