2017-10-06 3 views
0

Mein Hauptziel ist es, eine Abfrage zu schreiben, die nach dem Suchtext suchen müssen und wenn ein Filter des Ladens Port oder Entladen Port angewendet wird, dann muss es aus dem Ergebnis der Suchtext filtern.Elasticsearch bool Abfrage mit Filter und sollte

Und wenn kein Filter angewendet wird, sollte es weiter gehen.

Für zB: Ich suche nach Jeans und wenn ich Filter anwende muss der Ladeport Indien sein und sein Entladeport muss US sein.

Ich habe versucht, diesen Bericht zu schreiben, aber es gibt kein passendes Ergebnis.

{ 
"query": { 
    "bool": { 
     "should": [ 
     { 
      "bool": { 
      "must": [ 
       { 
       "query_string": { 
        "query": searchText 
       } 
       } 
      ] 
      } 
     }, 
     { 
      "terms": { 
      "loadingPort":loadingPortArray 
      } 
     }, 
     { 
      "terms": { 
      "unloadingPort":unloadingPortArray 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Bitte lesen Sie [Unter welchen Umständen kann ich „dringend“ oder andere ähnliche Ausdrücke auf meine Frage hinzufügen, um schneller Antworten zu erhalten?] (// meta.stackoverflow.com/q/326569) - die Zusammenfassung ist, dass dies kein idealer Weg ist, um Freiwillige anzusprechen, und ist wahrscheinlich kontraproduktiv, um Antworten zu erhalten. Bitte unterlassen Sie das Hinzufügen zu Ihren Fragen. – halfer

Antwort

0

Ihr Problem ist, dass Sie alle die Lagen \ Filter innerhalb should, wickeln, was bedeutet, dass alle Aussagen von OR Logik kombiniert werden. Wenn Sie AND benötigen, müssen Sie Anweisungen in must umbrechen.

Übrigens verwenden Sie nicht Filter, verwenden Sie term Abfrage. Es gibt einen großen Unterschied zwischen Abfrage und Filter in elasticsearch. Um den Filter zu verwenden, müssen Sie bool Abfrage mit Filter verwenden.

{ 
"query": { 
    "bool": { 
     "must": [ 
     { 
      "bool": { 
      "must": [ 
       { 
       "query_string": { 
        "query": searchText 
       } 
       } 
      ] 
      } 
     }   
     ], 
     "filter": { 
      "bool": { 
       "must": [ 
        { 
        "terms": { 
         "loadingPort":loadingPortArray 
        } 
        }, 
        { 
        "terms": { 
         "unloadingPort":loadingPortArray 
        } 
        } 
       ] 
      } 
     } 
    } 
    } 
} 
+0

Danke für die Antwort. Aber mein Hauptproblem ist, wenn der Benutzer keinen Filter anwendet, d. H. Lade-Port-Array und Entlade-Port-Array ist leer. In diesem Fall wird ein Fehler ausgegeben. – komal

+0

Sie können keine bedingten Filter anwenden. Stattdessen müssen Sie Ihre Abfrage bedingt erstellen und filtern, wenn sie vorhanden sind. –

+0

Können Sie mir bitte sagen, welche Bedingung ich verwenden sollte, wenn kein Filter angewendet wird. – komal

Verwandte Themen