2013-12-16 11 views
9

Die folgende range_query ein Ergebnis liefert wie erwartet:Abfrage in Elasticsearch mit mehreren Bereichen auf mehreren Terminen

{"query": { 
    "bool": { 
     "must": [ 
     { 
      "range": { 
      "created_at": { 
       "gte": "2013-12-09" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

Aber und-ing zusammen Abfragen mehrere Bereich, gibt nichts zurück:

{"query": { 
    "bool":{ 
     "must": [ 
     { 
      "and": [ 
      { 
       "range": { 
       "created_at": { 
        "gte": "2013-12-09" 
       } 
       } 
      }, 
      { 
       "range": { 
       "happens_on": { 
        "lte": "2013-12-16" 
       } 
       } 
      }, 
      { 
       "range": { 
       "created_at": { 
        "lte": "2013-12-14" 
       } 
       } 
      } 
      ] 
     } 
     ] 
    } 
    } 
} 

Was ist der korrekte Art, mehrere range_queries für mehrere Felder zu verwenden?

EDIT: Ah, ok, also das ist, wo ich ein Range_filter im Gegensatz zu Range_query verwenden? Das klang vielversprechend, also habe ich meine Abfrage mit nur einem einzigen Bereichsfilter neu geschrieben. Ich schreibe alles hier, falls ich die Anfrage irgendwo anders vermassle. Ich führe eine GET, und alles, was im Inneren des Quellschlüssel ist eigentlich JSON, aber ich entfernt das die Bindestriche zur besseren Lesbarkeit entkommen:

{ 
    "source": { 
    "filtered": { 
     "filter": { 
     "and": [ 
      { 
      "term": { 
       "restricted": false 
      } 
      }, 
      { 
      "not": { 
       "term": { 
       "deleted": true 
       } 
      } 
      }, 
      { 
      "range": { 
       "happens_on": { 
       "lte": "2013-12-16" 
       } 
      } 
      } 
     ] 
     }, 
     "query": { 
     "bool": { 
      "must": [ 
      ] 
     } 
     } 
    }, 
    "from": 0, 
    "size": 10 
    } 
} 

leider mein Problem ist immer noch das gleiche: Ich bin keine Treffer bekommen .

EDIT2: Also, gehen Sie die Gasse der Bereiche innerhalb einer Muss-Klausel wie Njal vorgeschlagen. Dies gibt mir eine Multi-Range-Abfrage wie folgt:

{ 
    "source": { 
    "filter": { 
     "and": [ 
     { 
      "term": { 
      "restricted": false 
      } 
     }, 
     { 
      "not": { 
      "term": { 
       "deleted": true 
      } 
      } 
     } 
     ] 
    }, 
    "from": 0, 
    "query": { 
     "bool": { 
     "must": [ 
      { 
      "range": { 
       "happens_on": { 
       "gte": "2013-12-06" 
       } 
      } 
      }, 
      { 
      "range": { 
       "created_at": { 
       "gte": "2013-12-15" 
       } 
      } 
      }, 
      { 
      "range": { 
       "happens_on": { 
       "lte": "2013-12-17" 
       } 
      } 
      }, 
      { 
      "range": { 
       "created_at": { 
       "lte": "2013-12-17" 
       } 
      } 
      } 
     ] 
     } 
    }, 
    "size": 10 
    } 
} 

Noch keine Ergebnisse zurückgegeben. Mache ich hier offensichtliche Fehler?

Antwort

12

Unter bool Abfragen 'must Klausel gibt es keine Notwendigkeit, es in eine and zu wickeln. Es gibt keine and Abfrage, vielleicht dachten Sie an die and filter?

Example runnable play als curl Befehle für Bequemlichkeit:

#!/bin/bash 

export ELASTICSEARCH_ENDPOINT="http://localhost:9200" 

# Create indexes 

curl -XPUT "$ELASTICSEARCH_ENDPOINT/play" -d '{ 
    "settings": {}, 
    "mappings": { 
     "type": { 
      "properties": { 
       "created_at": { 
        "type": "date", 
        "format": "dateOptionalTime" 
       }, 
       "name": { 
        "type": "string" 
       }, 
       "happens_on": { 
        "type": "date", 
        "format": "dateOptionalTime" 
       } 
      } 
     } 
    } 
}' 


# Index documents 
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d ' 
{"index":{"_index":"play","_type":"type"}} 
{"name":"foo","created_at":"2013-12-09T00:00:00.000Z","happens_on":"2013-12-16T00:00:00.000Z"} 
{"index":{"_index":"play","_type":"type"}} 
{"name":"bar","created_at":"2013-12-08T00:00:00.000Z","happens_on":"2013-12-16T00:00:00.000Z"} 
{"index":{"_index":"play","_type":"type"}} 
{"name":"bar","created_at":"2013-12-09T00:00:00.000Z","happens_on":"2013-12-17T00:00:00.000Z"} 
' 

# Do searches 

curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d ' 
{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "range": { 
         "created_at": { 
          "gte": "2013-12-09T00:00:00.000Z" 
         } 
        } 
       }, 
       { 
        "range": { 
         "happens_on": { 
          "lte": "2013-12-16T00:00:00.000Z" 
         } 
        } 
       } 
      ] 
     } 
    } 
} 
' 
+0

Danke für die Antwort und sorry für meine Verwirrung zu diesem Thema. Ich werde versuchen, meine Bereiche in der must-Klausel zu verschachteln. – thomax

+0

Ok, ich habe deinen Vorschlag ausprobiert, siehe mein EDIT2 in der Frage. Immer noch keine Ergebnisse. Könnte das mit der Datumsformatierung zusammenhängen? – thomax

+1

Riiiight. So stellte sich heraus, dass der Grund, warum ich Njals Vorschlag scheinbar nicht für mich funktionierte, war, dass mein Test versaut war. Jetzt ist der Test gelöst und die Lösung rockt. Vielen Dank! – thomax

Verwandte Themen