2012-10-02 66 views
4

我開始使用Symfony 2處理彈性搜索包,並對實體的搜索功能提出疑問。Symfony 2在多個實體上搜索FOQElasticaBundle

如果你有一個這樣的配置:

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'); 

上面的代碼不工作,但我不知道是否有這樣的一個方式做單搜索多個實體並根據其增強屬性獲取結果?

回答

1

正如我所看到的,有兩種方法可以做你想做的事。您可以爲用戶和客戶端創建一個父實體,並將其作爲類型添加到您的索引中。只要看看Doctrine的Inheritance Mapping;但我不確定FOQ_ElasticaBundle是否以及如何在索引中保留這些實體時處理這些內容。這只是一個方向的指針,我不確定這是否會起作用!

我會推薦以下方法:搜索索引而不是類型。您可以使用foq_elastica.index_manager來檢索所需的索引(網站),然後構建一個查詢,該查詢使用類型過濾器將結果限制爲您的用戶和客戶端類型。

+0

謝謝你的回覆,我採用了第二種方法,但我不確定你是否按照你的意思去做,我會用我的解決方案編輯我的帖子。 – CedricD

4

回答OP

這裏是我的解決方案...我編輯我的配置文件,必須在我的網站像這樣的根目錄下的取景器:

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'); 

這將搜索我的用戶和客戶端實體!

+0

排序方式?我的意思是,如果elasticSearch檢索這兩個表之間的隨機結果,或者如果檢索到第一個結果表 –

+0

不起作用... – 2017-03-09 11:48:57