2014-01-28 3 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. По моему опыту, вы ничего не можете сделать с Elastica, если он поддерживается Elasticsearch. Даже если в Elastica нет Mapper, просто используйте запрос Raw Array Query (http://elastica.io/example/raw-array-query.html), чтобы создать желаемый запрос.

Смежные вопросы