Symfony 对多索引搜索应用不同的筛选器

Symfony 对多索引搜索应用不同的筛选器,symfony,foselasticabundle,Symfony,Foselasticabundle,我正在使用FOSElasticaBundle和Symfony 3。我想在ES6中搜索不同的索引 我有两个实体狗,猫和一个字段名“所有者”(实体用户)。狗和猫有一个字段“name”(string),我想搜索每只狗,只搜索将其所有者设置为userId的猫 例如: 用户:#1鲍勃 用户:#2查尔 猫:#1联阵,主人#1 猫:帕特,主人 狗:#1联阵 狗:#2拍 如果我是鲍勃,我写“联阵”。我想要结果猫1,狗1,但如果我写“帕特”,我想要结果狗2 弹力 fos_elastica: client

我正在使用FOSElasticaBundle和Symfony 3。我想在ES6中搜索不同的索引

我有两个实体狗,猫和一个字段名“所有者”(实体用户)。狗和猫有一个字段“name”(string),我想搜索每只狗,只搜索将其所有者设置为userId的猫

例如:

  • 用户:#1鲍勃
  • 用户:#2查尔
  • 猫:#1联阵,主人#1
  • 猫:帕特,主人
  • 狗:#1联阵
  • 狗:#2拍
如果我是鲍勃,我写“联阵”。我想要结果猫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);