2016-07-24 11 views
1

: Ich bin mit Elastic Suche, haben aber jetzt mit diesem Problem für eine Weile sitzen:Elasticsearch query_string enthält Begriffe nicht abgefragt

Was ich versuche, mit viel gruppiert Kontrollkästchen ist eine gefilterte Suche zu erreichen (das dynamisch extrahiert), wie eine Gruppe für:

  • Grad (8-12),
  • Metadaten-Tags mit eindeutigen IDs (viele von ihnen),
  • Lehrplan (derzeit nur zwei),
  • Jahre usw.

Der Code, den ich zur Zeit (nicht alle Felder enthalten noch):

$query = Contribute::searchByQuery(["query"=> ["query_string"=> ["query"=> "(grade=>'12' OR '10') AND (syllabus=>'IEB') AND (meta_data=>'1')"]]], null, null, $paginate, $page); 

Das Problem, das ich aber habe, ist, dass dies würde zum Beispiel eine Zeile passen mit den folgenden Werten:

  • id == 1 (von meta_data => 1 ???), Lehrplan == IEB (fair genug), Grad == 11, meta_data == 1 (fair (warum?) genug)
  • id == 17, Lehrplan == IEB (fair genug), g rade == 9 (warum), meta_data == 3 (warum?)
  • und dann alle richtigen Zeilen scheinen auch zu
  • enthalten

Die Lösung (die nicht möglich ist, da Meta-Daten erweitern kann um tausende von Unique ID) ist das Hinzufügen nicht auf alle anderen bestehenden Bedingungen:

$query = Contribute::searchByQuery(["query"=> ["query_string"=> ["query"=> "(grade=>'12' OR '10' NOT '8' NOT '9' NOT '11') AND (syllabus=>'IEB' NOT 'DOE') AND (meta_data=>'1' NOT '2' NOT '3' NOT '4' etc etc etc.)"]]], null, null, $paginate, $page); 

die Frage ist also, wie kann ich keine Begriffe ausschließen, nicht angegeben, wird standardmäßig? Momentan schließen sie sich nur ein. Auf eine einfachere Weise als das zweite Stück Code, wo ich explizit hinzufügen muss, was ich nicht will.

Btw, ich baue diese Abfragen von der Benutzerauswahl, so ist es nicht so statisch wie in diesen Beispielen. Außerdem finde ich es sinnlos, eine Datenbanküberprüfung durchzuführen, um zu sehen, welche Begriffe der Abfrage nicht hinzugefügt wurden. Ist es nicht der Sinn der Elastic-Suche, Datenbankabfragen zu vermeiden?

Antwort

1

Sie mischen die Syntax Ihres PHP-Codes => mit der Lucene query string syntax.

(grade=>'12' OR '10') AND (syllabus=>'IEB') AND (meta_data=>'1') 

sollte stattdessen sein:

(grade:12 OR grade:10) AND (syllabus:IEB) AND (meta_data:1) 

Beachten Sie, dass ich unnötigen Zitate (in der Regel sind sie wirklich nur dann notwendig, wenn Sie Räume haben) entfernt und ersetzt => mit :. Ich reparierte auch die grade=>'12' OR '10', um nur Grad genau anzusehen. Ohne sie hatte das '10' kein Feld mit ihm verbunden und würde sich daher auf _all field, als ob es das war:

(grade:12 OR _all:10) AND (syllabus:IEB) AND (meta_data:1) 
+0

Vielen Dank, es funktioniert jetzt richtig: D. Anfänglich hatte ich die Anführungszeichen entfernt, aber fügte es im Laufe der Zeit als ein Versuch, das Problem zu lösen. Auch hatte es als (Note => 12 OR Klasse => 10), aber das machte keinen Unterschied im Vergleich zu (Note => 12 oder 10), aber das gesamte Problem scheint von verwirrend zu stammen: mit =>, wie du erwähnt hast.Das ist passiert, weil ich gerade den allgemeinen Fehler erwartet habe = = anstelle von: für die anderen Teile. – SwCharlie

Verwandte Themen