2016-07-27 5 views
0

Die folgende Abfrage liefert Ergebnisse:Feinabstimmung von Match_all-Abfragen?

GET /sentinel/pingback/_search 
{ 
     "match_all": {} 
} 

Ich wollte die query zur Feinabstimmung eines Zeitbereich

hinzufügen
GET /sentinel/pingback/_search 
{ 
    "query": { 
     "range": { 
     "time": { 
      "gte": "now-20m" 
     } 
     }, 
     "match_all": {} 
    } 
} 

Dies funktioniert nicht mehr, ist der Fehler

"error": { 
     "root_cause": [ 
     { 
      "type": "parse_exception", 
      "reason": "failed to parse search source. expected field name but got [START_OBJECT]" 
     } 
     ], 
(...) 

Der Zeitbereich funktioniert jedoch korrekt, wenn er

012 ist

Ich habe daher erwartet, dass für eine query ich unabhängige "Feinabstimmung" -Komponenten hinzufügen könnte (wie range zum Beispiel), aber anscheinend funktioniert es nicht so.

Wie diese Abfrage Einschränkungen zu kombinieren?

Hinweis: Ich weiß, dass ich match_all in der Abfrage oben loswerden kann. Ich will es halten, weil es entweder ein match_all oder ein match sein wird (was eine weitere Einschränkung ist, ich wünschte, um hinzuzufügen, die allumfassende query

Antwort

1

Sie können Einschränkungen kombinieren die Bool Abfrage:

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

Aber ich weiß nicht wirklich den Punkt, warum Sie match_all mit Spiel Abfrage kombinieren möchten für mich nicht wirklich Sinn macht

EDIT:..

Wenn Sie entweder jedes Dokument abgleichen oder einen Feldwert für einen bestimmten Wert filtern möchten, sollten Sie das in einer Programmiersprache wie Javascript tun.

Übereinstimmung wird nur mit einem Wert übereinstimmen, wie der Name angibt. Wenn Sie nach genauen Übereinstimmungen suchen möchten, sehen Sie sich den Suchbegriff an (abhängig von Ihrer ES-Version auch Begriff Filter für < 2.0).

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

Dann, wenn kein Filter ausgewählt, nicht nur ein match_all, bauen sonst zusammen, um Ihre Abfrage json mit dem Begriff Abfrage. Wenn Sie mehrere Einschränkungen haben, kombinieren Sie sie mit der bool-Abfrage.

Für einige Programmiersprachen gibt es auch Abfrage-Builder-Bibliotheken, z.B. für Javascript (offizielle):

https://www.npmjs.com/package/elasticsearch

Grundsätzlich sind die Abfragen derselben von einer logischen Perspektive als in anderen Datenbanken arbeiten, nur die Syntax ist anders.

+0

Der Körper des Abfrage wird programmatisch erstellt. In einem Fall werde ich alles anpassen wollen (mit '" match_all ": {}') und in anderen Fällen muss ich einen genauen Wert eines Feldes (obwohl 'match') übereinstimmen. Da ich keine Platzhalter für Übereinstimmungen gefunden habe (um zu sagen, dass das Feld 'name' zum Beispiel alles sein kann), muss ich (?)' 'Match_all 'verwenden: {}' Es ist wahr, dass es mir schwer fällt, das zu verstehen Logik der Suchkörper in ES) – WoJ

+0

Siehe meine Bearbeitung. Es ist auch nur eine Sache, wenn es sinnvoll ist, zu kombinieren, wenn Sie nach einem bestimmten Wert suchen und anschließend die verbleibenden nicht übereinstimmenden Dokumente im Ergebnis anhängen möchten. Dort können Sie beispielsweise eine Punktzahl für die übereinstimmenden Dokumente von 3 setzen, und die übrigen im Spiel erhalten alle eine 1. Ergebnis 3 ist höher als 1, also kommen sie zuerst. – Nilz11

+0

Danke. Dank deinem Kommentar zu 'bool' habe ich die Lösung ausgearbeitet und als Antwort gepostet. Danke für den Kopf! – WoJ

0

Basierend auf Nilz11's answer, habe ich herausgefunden, wie Sie das Problem anzugehen. Der Schlüssel (so weit ich es verstehe) besteht darin, alle Beschränkungen in bool zu sammeln.

In meinem Beispiel das wäre:

für match_all:

{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "range": { 
        "time": { 
        "gte": "now-10m" 
        } 
       } 
      }, 
      { 
       "match_all": {} 
      } 
     ] 
     } 
    } 
} 

für das spezifische Spiel (ein Name, zum Beispiel):

{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "range": { 
        "time": { 
        "gte": "now-10m" 
        } 
       } 
      }, 
      { "match": { "name": "John"}} 
     ] 
     } 
    } 
} 
+0

Im ersten Fall können Sie match_all weglassen, da es sowieso alle Ergebnisse zurückgibt + gefiltert nach der Bereichsabfrage. – Nilz11

+0

Danke. Ja, mir ist klar geworden, dass ich jetzt eine Liste ('[...]') habe, die leicht programmatisch erweiterbar ist, so dass ich den Platzhalter "passender Teil", den ich vorher brauchte, nicht brauche. – WoJ

Verwandte Themen