2014-01-28 52 views
6

我使用FOSElasticaBundle來處理搜索。當我有一層嵌套時,所有的作品都很棒。然而,當我有兩層嵌套結果應該與最內層的嵌套匹配時,不會返回(例如,搜索'xx'類別確實會產生結果,但搜索'yy'品牌不會 - 也應該)。FOSElasticaBundle多重嵌套查詢

這裏是我的fos_elastica配置:

fos_elastica: 
clients: 
    default: { host: localhost, port: 9200 } 
indexes: 
    my_index: 
     client: default 
     types: 
      product: 
       mappings: 
        title: { boost: 1 } 
        articleNumber: ~ 
        introductionDateSearch: { type: integer } 
        delistingDateSearch: { type: integer } 
        deleted: { type: boolean } 
        category: 
         type: "nested" 
         properties: 
          name: { boost: 1 } 
          brand: 
           type: "nested" 
           properties: 
            name: { boost: 1 } 
       persistence: 
        driver: orm 
        model: MyBundle\Entity\Product 
        provider: ~ 
        finder: ~ 
        listener: ~ 

我的查詢處理程序:

public function searchForKeyword($keyword, AbstractUser $user) 
{ 
    $this->setFilters($user); 
    $keyword = trim($keyword); 

    if ($keyword !== '') { 
     $mainQuery = new \Elastica\Query\Bool(); 
     $mainProductQuery = new \Elastica\Query\Bool(); 

     //searching in Product title 
     $productQuery = new \Elastica\Query\Text(); 
     $productQuery->setFieldQuery('title', $keyword); 
     $productQuery->setFieldParam('title', 'boost', 5); 
     $productQuery->setFieldParam('title', 'type', 'phrase_prefix'); 

     //searching in Product articleNumber 
     $articleNumberQuery = new \Elastica\Query\Text(); 
     $articleNumberQuery->setFieldQuery('articleNumber', $keyword); 
     $articleNumberQuery->setFieldParam('articleNumber', 'boost', 5); 
     $articleNumberQuery->setFieldParam('articleNumber', 'type', 'phrase_prefix'); 

     //searching in Category name 
     $categoryQuery = new \Elastica\Query\Text(); 
     $categoryQuery->setFieldQuery('name', $keyword); 
     $categoryQuery->setFieldParam('name', 'boost', 3); 
     $categoryQuery->setFieldParam('name', 'type', 'phrase_prefix'); 

     $nestedCategoryProductQuery = new \Elastica\Query\Nested(); 
     $nestedCategoryProductQuery->setPath('category'); 
     $nestedCategoryProductQuery->setQuery($categoryQuery); 

     //searching in Brand name 
     $brandQuery = new \Elastica\Query\Text(); 
     $brandQuery->setFieldQuery('name', $keyword); 
     $brandQuery->setFieldParam('name', 'boost', 3); 
     $brandQuery->setFieldParam('name', 'type', 'phrase_prefix'); 

     $nestedBrandCategoryQuery = new \Elastica\Query\Nested(); 
     $nestedBrandCategoryQuery->setPath('category.brand'); 
     $nestedBrandCategoryQuery->setQuery($brandQuery); 

     $mainProductQuery->addShould($productQuery); 
     $mainProductQuery->addShould($articleNumberQuery); 
     $mainProductQuery->addShould($nestedCategoryProductQuery); 
     $mainProductQuery->addShould($nestedBrandCategoryQuery); 

     $mainQuery->addMust($mainProductQuery); 

     $esFilteredQuery = new \Elastica\Query\Filtered($mainQuery, $this->filters); 

    } else { 
     $esFilteredQuery = new \Elastica\Query\Filtered(new \Elastica\Query\MatchAll(), $this->filters); 
    } 

    $this->query = new \Elastica\Query(); 
    $this->query->setQuery($esFilteredQuery); 
} 

是如何$nestedBrandCategoryQuery加入$mainProductQuery

感謝您的幫助! gtb

+0

你對yur問題有什麼好運嗎?我會面對同樣的問題,我想知道你是否設法找到解決方案。 –

+0

我不認爲這是您遇到問題的原因,但我認爲\ Elastica \ Query \ Text()會折舊,您應該使用\ Elastica \ Query \ Match()。 – Tor

+0

感謝您的回覆。我可以嘗試使用Match()而不是Text(),但我認爲這不會解決問題(因爲多個嵌套「被假定」被FOSElasticaBundle支持)。也許我會甚至嘗試更新這個包... @CédricNirousset我還沒有找到解決方案。 – gtb

回答

0

FOSElasticaBundle使用Elastica庫。所以這不應該是FOSElasticaBundle的問題。

查看http://elastica.io/瞭解更多關於Lib的細節。根據我的經驗,如果Elasticsearch支持它,那麼您就無法使用Elastica。即使在Elastica中沒有映射器,只需使用原始數組查詢(http://elastica.io/example/raw-array-query.html)即可構建所需的查詢。