Ich bin neu bei elasticsearch und habe Probleme mit der Abfrage, die ich brauche. Ich habe Abfragen, Filter, booling Abfragen und verschachtelte Objekte gelesen, aber ich bin immer noch ein wenig ratlos. Ich benutze das PHP-Composer-Paket für elasticsearch, aber ich denke, es ist eher ein Problem mit meinem Setup.Elasticsearch: Filtere mehrere Arrays verschachtelter Objekte
Ich versuche, Objekte basierend auf einer Eigenschaft, die sie haben, und Eigenschaften, die ihre verschachtelten Objekte haben, zu filtern.
ein Beispiel Objekt, das ich habe ist, wie folgt:
{
'id' : '1',
'title' : 'real catchy title',
'description' : 'description goes here',
'content' : [
'id' : '1',
'title' : 'foo',
'subtitle' : 'bar',
'text' : 'legit full text',
'sidebar' : 'whatever yo!',
],
'pages' : '12',
'departments' : [
{
'id' : '1',
'name' : 'foo',
'description' : 'lorem ipsum'
},
{
'id' : '2',
'name' : 'bar',
'description' : 'lorem ipsum'
}
]
'themes' : [
{
'id' : '1',
'name' : 'foo',
'description' : 'lorem ipsum',
'month' : '3'
},
{
'id' : '2',
'name' : 'bar',
'description' : 'lorem ipsum',
'month' : '2'
}
]
}
und ich versuche, auf sie zu filtern, basierend auf, wenn die Seite eine bestimmte Anzahl übereinstimmt, und wenn es eine Abteilung mit einer bestimmten Abteilung ID und hat ein Thema mit einer bestimmten Themen-ID.
Um dies zu tun, habe ich meinen Mapping als:
[
'index' : ,'reusable_content'
'body' => [
'mappings' => [
'reusable_content' => [
'_all' => ['analyzer' => 'english'],
'properties' => [
'departments' => [
'type' => 'nested',
"include_in_parent" => true
],
'themes' => [
'type' => 'nested',
"include_in_parent" => true
]
]
]
]
]
]
ich es einfügen und dann, ich habe ein paar Möglichkeiten versucht, es zu fragen, nachdem ich einige Einträge hinzufügen.
Ich habe versucht, boolean verschachtelte Filter verwenden:
[
'index' => $this->getIndexName(),
'type' => 'reusable_content',
'body' => [
'query' => [
'filtered' => [
'query' => ['match_all' => []],
'filter' => [
'bool' => [
'should' => [
'nested' => [
'path' => 'themes',
'filter' => [
'bool' => [
'must' => [
'term' => [
'id' => $themeId
]
]
]
]
],
'nested' => [
'path' => 'departments',
'filter' => [
'bool' => [
'must' => [
'term' => [
'id' => $departmentId
]
]
]
]
]
]
]
]
]
]
]
]
dies keine Ergebnisse zurückgibt.
Ich habe versucht, mit einfachen Methoden wie ein bool für die Filter als auch abgefragt werden muß:
[
'index' => $this->getIndexName(),
'type' => 'reusable_content',
'body' => [
'query' => [
'filtered' => [
'query' => ['match_all' => []],
'filter' => [
'bool' => [
'must' => ['term' => ['pages' => $pages]],
'must' => ['term' => ['departments.id' => $departmentId]],
'must' => ['term' => ['themes.id' => $themeId]],
]
]
]
]
]
]
dies meist funktioniert jedoch ignoriert sie die Seiten Filterung, aber wenn ich nur die 'must' => ['term' => ['pages' => $pages]],
für die Filter und ignoriere die ID-Felder, der Seitenfilter funktioniert.
Ich bin ziemlich neu in der elastischen Suche, also wenn ich irgendeine seltsame Annahme mache oder etwas sehr falsch mache, lass es mich wissen, damit ich lernen kann, und wenn du mehr Informationen brauchst, bitte einfach fragen!
Interessant. In meinem Fall werden die Seiten und die IDs jedoch immer Nummern sein. Ich würde damit keine merkwürdigen Token-Conversions erwarten. Auch, wenn ich sie einzeln benutze, funktionieren sie, aber wenn ich versuche, alle drei zu kombinieren, ist das nicht der Fall. – samuraiseoul
Obwohl sie Zahlen werden, haben Sie ihre Typen auf Integer gesetzt? – rajat