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
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. –
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
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