在多索引搜索

时间:2017-11-26 19:44:00

标签: symfony foselasticabundle

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

我有两个实体狗,猫有一个字段名称"所有者" (实体用户)。狗和猫有一个领域"名称" (字符串),我想搜索每只狗,只有那些拥有它的所有者设置在userId。

示例:

  • 用户:#1 Bob
  • 网友:#2 Charle
  • Cat:#1 Ruf,所有者#1
  • Cat:#2 Pat,所有者#2
  • 狗:#1 Ruf
  • 狗:#2 Pat

如果我是鲍勃,我会写" 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上使用过滤器吗?我能为每个索引使用一个存储库吗?

3 个答案:

答案 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中找到如何进行多索引搜索。