Beeinflussung der Suchergebnisse aus dem SearchBundle

Hallo Zusammen,

ich habe ein Problem bei der Suchergebnisliste aus dem SearchBundle. Ich möchte zu einem Suchegriff den naheliegensten Artikel erhalten. Hierzu setze ich folgenden Code ein:

    private function fetchArticlesFromSearchstring($searchstring, $limit, $offset=0) {
        // $searchstring = "Batterie"; $limit=1; $offset=0;
        $context = Shopware()->Container()->get('shopware_storefront.context_service')->getProductContext();
        $criteria = new \Shopware\Bundle\SearchBundle\Criteria();
        $criteria->addCondition(new \Shopware\Bundle\SearchBundle\Condition\SearchTermCondition($searchstring));
        $criteria->offset($offset);
        $criteria->limit($limit);

        $searchresult = Shopware()->Container()->get('shopware_search.product_search')->search(
            $criteria,
            $context
        );
        return $searchresult;
    }

Suche ich nun z.B. nach dem Term “Batterie”, so bekomme ich einen Artikel zurückgegeben, welcher lautet “Lezyne LIR123A V2 Batterie für LED Drive”. Setze ich nun einen Hersteller vor den Term (suche also z.B. nach “VDO Batterie”), so bekomme ich weiterhin denselben Artikel zurück, wie bei der Suchen nach “Batterie”. Der erwartetet Artikel wäre aber “VDO - BAT 3V Ersatzbatterie” (die einzige Batterie dieses Herstellers im Shop). Nun habe ich testweise den Term “VDO Ersatzbatterie” angegeben, wodurch die Suche recht treffgenau sein müsste, allerdings erhalte ich den Artikel “VDO X2DW Fahrradcomputer” zurück.

Wie setzt sich das Suchergebnis zusammen, bzw. wie kommt es zu diesen komischen Suchergebnissen? Wie muss ich die Suche beeinflussen, dass die erwarteten Suchergebnisse zurückgegeben werden? Ist es möglich die SQL-Abfrage zu debuggen um zu sehen was dort überhaupt für eine Abfrage durchgeführt wird?

Im Voraus schonmal vielen Dank für euer Feedback!

Hi,

ich denke, du kannst am besten hier einsteigen: \Shopware\Bundle\SearchBundleDBAL\ConditionHandler\SearchTermConditionHandler::generateCondition. Von da läuft das Programm weiter nach \Shopware\Bundle\SearchBundleDBAL\SearchTerm\SearchTermQueryBuilder::buildQuery, wo die verschiedenen Keywords gezogen werden und dann in \Shopware\Bundle\SearchBundleDBAL\SearchTerm\SearchTermQueryBuilder::buildQueryFromKeywords das SQL dazu generiert wird.

Ansonsten kannst du dir ggf. auch die ElasticSearch-Integration nochmal ansehen, ElasticSearch ist da ja auch sehr gut.

Daniel