2017-03-11 1 views
-1

im mit Laravel schreiben, und Elasticsearch und ich will jetzt eine Suchabfrage schreiben: aber mein Problem ist, ich weiß nicht, wie eine Abfrage wie folgt schreiben: (preference_1 = Äpfel oder preference_2 = Bananen) und (preference_1 = Äpfel oder preference_2 = Kirschen) UND preference_1 = Grapefruitswie eine komplexe Suchabfrage in Elasticsearch

ich weiß, wie man schreibt: (preference_1 = Äpfel und preference_2 = Bananen) OR (preference_1 = Äpfel und preference_2 = Kirschen) ODER preference_1 = Grapefruits

mit einem sollte und mehrere muss es passieren .. aber ich weiß nicht, wie man das Gegenteil davon tun?

"query" => [ 
"bool" => [ 
      "should" => [[ 
       "bool" => [ 
        "must" => [[ 
         "match" => [ 
          "preference_1" => "Apples" 
         ] 
        ], [ 
         "match" => [ 
          "preference_2" => "Bananas" 
         ] 
        ]] 
       ] 
      ], [ 
       "bool" => [ 
        "must" => [[ 
         "match" => [ 
          "preference_1" => "Apples" 
         ] 
        ], [ 
         "match" => [ 
          "preference_2" => "Cherries" 
         ] 
        ]] 
       ] 
      ], [ 
       "match" => [ 
        "preference_1" => "Grapefruit" 
       ] 
      ]] 
     ] 
] 

Ich möchte wissen, wie diese schreiben: (preference_1 = Äpfel oder preference_2 = Bananen) und (preference_1 = Äpfel oder preference_2 = Kirschen) UND preference_1 =

Grapefruits i lesen Elasticsearch doc, aber ich habe nichts gefunden, oder irgendein Beispiel ..

danke für Ihre Hilfe.

+0

Sie können innerhalb von müssen – paqash

+0

verschachteln ja .. aber ich muss eine dynamische Anordnung von sollte und müssen in meinem Code .. hängt von einigen wenn und sonst .. – maral

Antwort

0

Sie können filter für and (non-scoring Filterabfragen) auf die gleiche Weise verwenden, die Sie should verwendet haben.

{:query=> 
    {:bool=> 
    {:must=>[{:match_all=>{}}], 
    :filter=> 
     [{:bool=> 
     {:should=> 
      [{:term=>{:preference_1=>"Apples"}}, 
      {:term=>{:preference_2=>"Bananas"}}], 
      :minimum_should_match=>1}}, 
     {:bool=> 
     {:should=> 
      [{:term=>{:preference_1=>"Apples"}}, 
      {:term=>{:preference_2=>"Cherries"}}], 
      :minimum_should_match=>1}}, 
     {:bool=> 
     {:should=>[{:term=>{:preference_1=>"Grapefruits"}}], 
      :minimum_should_match=>1}}]}}} 
+0

danke für Ihre Antwort. aber es hat nicht funktioniert für mich .. sollte ich match_all Abfrage verwenden, um meine Antwort zu bekommen? oder ohne es wird es in Ordnung sein? und in meinem Code muss ich Abfrage dynamisch machen .. ich meine, ich muss hinzufügen einige müssen und einige sollten in einigen wenn und sonst .. so will ich einen Weg, um eine Reihe von Müssen und sollten .. und am ende meines codes sende das an elasticsearch. – maral

+0

Ich erstelle auch eine generische Abfrage mit if und sonst. Wenn es also einen Suchbegriff gibt, verwende ich nicht match_all, sonst füge ich match_all hinzu. Was hast du in deinem if/else, dann mache ich ein if/else wie folgt: 'if operator == 'oder' dann bool [: soll] = [] sonst if operator == 'und' dann bool [: filter] = [] '. Nachdem ich dies getan habe, füge ich Abfrage in sollte oder Filter – saurabh

+0

ok nach vielen versuchen, schrieb ich meine Abfrage mit Ihrem Vorschlag..thanks aber ich habe ein anderes Problem jetzt! Ich habe einige Abfrage in Bool => Filter ... und einige in Filter .. aber meine Abfrage Ergebnis nur Filter Ergebnis anzeigen .. und ignorieren Sie meine Bool => [Filter => ..] Ergebnis .. was kann ich jetzt tun, um es zu lösen? – maral

0

meine Frage ist nur wie das Ihre .. aber ich löschen ‚muss‘ von that..to es

body => [ 
    query => [ 
    bool => [ 
     filter => [ 
     [ 
      bool => [ 
       should => [ 
        [term => [preference_1 => "Apples" ]], 
        [term => [preference_2 =>"Bananas" ]] 
       ] 
      ] 
     ], 
     [ 
      bool => [ 
       should => [ 
       [term => [preference_1 => "Apples" ]], 
       [term => [preference_2=>"Cherries"]] 
       ] 
      ] 
     ], 
     [ 
      bool => [ 
       should => [ 
       [term => [preference_1 => "Grapefruits"]] 
       ] 
      ] 
     ] 
     ] 
    ] 
    ] 
], 
filter => [ 
[ 
    term => [field3 => "dog" ] 
] 
] 

aber wenn ich aktive Filterabfrage funktioniert ... elastische meinen Körper ignorieren Abfrage.