2014-01-28 48 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)即可构建所需的查询。