2014-01-28 11 views
6

Ich benutze FOSlaslasticaBundle um die Suche zu bearbeiten. Alles funktioniert gut, wenn ich eine Verschachtelungsstufe habe. Wenn ich jedoch zwei Ebenen von Verschachtelungsergebnissen habe, die mit dem innersten Verschachtelungsmuster übereinstimmen, werden sie nicht zurückgegeben (z. B. die Suche nach "xx" -Kategorie führt zu Ergebnissen, aber die Suche nach "yy" -Marke funktioniert nicht - und sollte).FOSlaslasticaBundle multiple verschachtelte Abfrage

Hier ist meine fos_elastica Konfiguration:

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: ~ 

Und meine Abfrage-Handler:

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

Wie wird die $nestedBrandCategoryQuery zum $mainProductQuery hinzugefügt?

Danke für Ihre Hilfe! gtb

+0

Haben Sie Glück mit Ihrem Problem? Ich werde das gleiche Problem haben und ich würde gerne wissen, ob Sie es schaffen, eine Lösung zu finden. –

+0

Ich nehme nicht an, dass es der Grund ist, warum Sie das Problem haben, aber ich denke, \ Elastica \ Query \ Text() wird abgeschrieben und Sie sollten stattdessen \ Elastica \ Query \ Match() verwenden. – Tor

+0

Danke für die Antwort. Ich kann versuchen, Match() anstelle von Text() zu verwenden, aber ich denke nicht, dass dies das Problem lösen wird (da mehrere Verschachtelung "angeblich" von FOSelasticaBundle unterstützt wird). Vielleicht werde ich sogar versuchen, dieses Bundle zu aktualisieren ... @ CédricNirousset Ich habe noch keine Lösung gefunden. – gtb

Antwort

0

FOSAlasticaBundle verwendet die Elastica-Bibliothek. Das sollte also kein Thema von FOSAlasticaBundle sein.

Werfen Sie einen Blick auf http://elastica.io/ für weitere Details über die Lib. Meiner Erfahrung nach gibt es nichts, was man mit Elastica nicht machen kann, wenn es von Elasticsearch unterstützt wird. Auch wenn in Elastica kein Mapper vorhanden ist, verwenden Sie einfach die Raw-Array-Abfrage (http://elastica.io/example/raw-array-query.html), um die gewünschte Abfrage zu erstellen.