2016-07-19 12 views
1

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!

Antwort

1

Ihre erste Abfrage scheint in Ordnung zu sein. Das Problem scheint bei der Abfrage des Analysators und der Begriffe zu liegen. Terms filter sucht nach exakter Übereinstimmung im invertierten Index, d. H. Angenommen, der Themenname war "Glück", dann kann der englische Analysator ihn als "glücklich" indexieren. Also würde der Begriff Filter genau das Token benötigen, das indiziert ist, was im obigen Fall "glücklich" und nicht "glücklich" ist. Ich würde empfehlen, den Begriffsfilter in eine Übereinstimmungsabfrage zu ändern, weil er zuerst die Zeichenfolge analysiert, und wenn er das Ergebnis zurückgibt, sollte der Analysator geändert oder die Übereinstimmungsabfrage beibehalten werden.

+0

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

+0

Obwohl sie Zahlen werden, haben Sie ihre Typen auf Integer gesetzt? – rajat

Verwandte Themen