2017-09-11 4 views
1

Ich habe gerade mit der Verwendung von Elastic Search begonnen. Ich habe alles richtig eingerichtet. Ich verwende Firebase + Flashlight + Elastic Search.Seltsame Ausgabe Abfrage Elastische Suche

In meinem Frontend erstelle ich Abfragen basierend auf verschiedenen Suchparametern. Ich füge sie in einen Knoten in Firebase /search/requests/ ein. Taschenlampe wird dies aufheben und die Antwort in /search/response setzen, das funktioniert wie ein Charme!

Allerdings bin ich mir nicht sicher, wie ich meine Abfragen richtig schreiben. Ich bekomme merkwürdige Ergebnisse, wenn ich versuche, zwei mustmatch Abfragen zu kombinieren. Ich benutze Query DSL.

Meine Dokumente in Elastic Search unter deliverables/doc haben das folgende Schema.

... 
{ 
    "createdBy" : "[email protected]", 
    "createdOn" : 1501200000000, 
    "deadLine" : 1508716800000, 
    "description" : { 
    "value" : "dummy description" 
    }, 
    "key" : "<FBKEY>", 

    "programmes" : [ { 
    "code" : "95000", 
    "name" : "Test programme", 
    "programYear" : 2017 
    } ], 
    "projects" : [ { 
    "projectCode" : "113200", 
    "projectName" : "Test project", 
    "projectYear" : 2017 
    } ], 
    "reportingYear" : 2017, 
    "status" : "Open", 
    "type" : "writing", 
    "updatedBy" : "[email protected]", 
    "updatedOn" : 1501200000000, 
}, 
... 

Meine Abfrage hat die folgende Struktur.

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "createdBy": "[email protected]" 
      }, 
      "match": { 
      "programmes.code": "95000" 
      } 
     } 
     ] 
    } 
    } 
} 

In meiner Ausgabe bekomme ich auch Dokumente, die genau diese beiden Felder nicht haben? Sie haben auch eine sehr niedrige Punktzahl. Ist das normal?

Mein Mapping, erstellt automatisch Taschenlampe mit

enter image description here

Update 1

ich diese Abfrage gerade versucht, aber es gibt mir immer noch seltsame Ergebnisse durch nicht Filterung auf beiden Feldern:

{ 
    "query": { 
     "bool": { 
     "filter": { 
      "bool": { 
       "must": [ 
        { 
        "match": { 
         "programmes.code": "890000" 
        } 
        }, 
        { 
        "match": { 
         "createdBy": "[email protected]" 
        } 
        } 
       ] 
      } 
     } 
     } 
    } 
} 

Antwort

2

Die must Klausel inverwendetwird in Abfrage Kontext (alle Dokumente werden in absteigender Reihenfolge der Punktzahl zurückgegeben) ausgeführt und trägt zur Punktzahl. see link

Wenn Sie es wollen, als ein Filter ausgeführt werden, dann die folgende Abfrage verwenden:

{ 
    "query": { 
    "bool": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "match": { 
       "createdBy": "[email protected]" 
       } 
      }, 
      { 
       "match": { 
       "programmes.code": "95000" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

HINWEIS:

das String-Feld analysiert wird, aktualisieren Sie die Zuordnung der standardmäßig Zeichenfolge Felder wie not_analyzed, filter Abfrage verwenden. Siehe: mapping-intro

+0

Vielen Dank Chandra !! Wie konnte ich das verpasst haben ... – Rover

+0

Ich habe gerade versucht, diese Abfrage, aber es gibt mir immer noch seltsame Ergebnisse durch nicht auf beiden Feldern zu filtern. Siehe Update in Start Post – Rover

+0

Eine Modifikation ist, dass Sie 'match' durch' term' ersetzen können, so dass das Feld nicht analysiert wird. –

Verwandte Themen