4

我开始在 Symfony 2 中使用 Elastic Search Bundle,并且对实体的搜索功能有疑问。

如果你有这样的配置:

foq_elastica:
clients:
    default: { host: localhost, port: 9200 }
indexes:
    website:
        client: default
        types:
            user:
                mappings:
                    username: { boost: 5 }
                    firstName: { boost: 3 }
                persistence:
                    driver: orm # orm, mongodb, propel are available
                    model: Application\UserBundle\Entity\User
                    provider:

然后,您可以像这样搜索索引:

$userType = $this->container->get('foq_elastica.index.website.user');

$resultSet = $userType->search('bob');

但是如果你想用一个函数搜索多个实体呢?就像是...

配置:

foq_elastica:
clients:
    default: { host: localhost, port: 9200 }
indexes:
    website:
        client: default
        types:
            user:
                mappings:
                    username: { boost: 5 }
                    firstName: { boost: 3 }
                persistence:
                    driver: orm
                    model: Application\UserBundle\Entity\User
                    provider:
            client:
                mappings:
                    clientname: { boost: 5 }
                persistence:
                    driver: orm 
                    model: Application\UserBundle\Entity\Client
                    provider:

搜索功能:

$Type = $this->container->get(['foq_elastica.index.website.user', 'foq_elastica.index.website.client']);

$resultSet = $Type->search('bob');

上面的代码不起作用,但我想知道是否有一种方法可以对多个实体进行一次搜索并根据它们的 boost 属性获取结果?

4

2 回答 2

4

来自 OP 的回答

这是我的解决方案...我编辑了我的配置文件,让 finder 位于我网站的根目录,如下所示:

foq_elastica:
clients:
    default: { host: localhost, port: 9200 }
indexes:
    website:
        client: default
        finder:
        types:
            user:
                mappings:
                    username: { boost: 5 }
                    firstName: { boost: 3 }
                persistence:
                    driver: orm
                    model: Application\UserBundle\Entity\User
                    provider:
            client:
                mappings:
                    clientname: { boost: 5 }
                persistence:
                    driver: orm 
                    model: Application\UserBundle\Entity\Client
                    provider:

我这样称呼我的搜索......

$finder = $this->container->get('foq_elastica.finder.website');

$results = $finder->find('bob');

它将在我的用户和客户实体中搜索!

于 2012-10-12T15:52:46.297 回答
1

在我看来,有两种方法可以做你想做的事。您可以为 User 和 Client 创建父实体并将其作为类型添加到索引中。看看 Doctrine 的继承映射;但是,我不确定 FOQ_ElasticaBundle 在将这些实体保留在索引中时是否以及如何处理这些。这只是一个方向的指针,我不确定这是否会起作用!

我会推荐以下方法:搜索索引而不是类型。您可以使用foq_elastica.index_manager检索所需的索引(网站),然后构建一个查询,该查询使用类型过滤器将结果限制为您的用户和客户端类型。

于 2012-10-02T07:52:47.477 回答