2017-01-31 2 views
0

Ich weiß, dass es mehrere alternative elasticsearch Clients für Python über this one gibt. Ich habe jedoch keinen Zugriff darauf. Wie kann ich eine Abfrage schreiben, die für einen Zeitstempel eine "weniger als oder gleich" Logik hat? Meine heutige Art und Weise, dies zu tun ist:Python elasticsearch Bereich Abfrage

query = group_id:" + gid + '" AND data_model.fields.price:' + price 
less_than_time = # datetime object 
data = self.es.search(index=self.es_index, q=query, size=searchsize) 
hits = data['hits']['hits'] 
results = [] 
for hit in hits: 
    time = datetime.strptime(hit['_source']['data_model']['utc_time'], time_format) 
    dt = abs(time - less_than_time).seconds 
    if dt <= 0: 
     results.append(hit) 

Dies ist eine wirklich ungeschickt Art und Weise tun. Gibt es eine Möglichkeit, meine Abfragegenerierung mithilfe von Zeichenfolgen zu halten und einen Bereich einzuschließen?

+0

Haben Sie nur die Abfrage wollen:

Dies kann und eine Abfrage spuckt wie genannt werden? Ich habe ein kleines Skript, das eine gültige Abfrage (für mich) erzeugt, die ich mit es2csv verwende. Es generiert eine korrekte JSON-Abfrage – pandaadb

+0

@pandaadb ja, ich brauche nur Code, um die Abfrage zu generieren. Grundsätzlich die Möglichkeit, Abfragen basierend auf 'lte' oder 'gte' Bedingungen zu generieren. –

Antwort

1

Ich habe ein kleines Skript, das eine Abfrage für mich generiert. Die Abfrage ist jedoch in der Json-Notation (die ich glaube, dass der Client verwenden kann).

hier ist mein Skript:

#!/usr/bin/python 

from datetime import datetime 
import sys 

RANGE = '"range":{"@timestamp":{"gte":"%s","lt":"%s"}}' 
QUERY = '{"query":{"bool":{"must":[{"prefix": {"myType":"test"}},{%s}]}}}' 

if __name__ == "__main__": 
    if len(sys.argv) < 3: 
     print "\nERROR: 2 Date arguments needed: From and To, for example:\n\n./range_query.py 2016-08-10T00:00:00.000Z 2016-08-10T00:00:00.000Z\n\n" 
     sys.exit(1) 
    try: 
     date1 = datetime.strptime(sys.argv[1], "%Y-%m-%dT%H:%M:%S.%fZ") 
     date2 = datetime.strptime(sys.argv[2], "%Y-%m-%dT%H:%M:%S.%fZ") 

    except: 
     print "\nERROR: Invalid dates. From: %s, To: %s" %(sys.argv[1], sys.argv[2]) + "\n\nValid date format: %Y-%m-%dT%H:%M:%S.%fZ\n" 
     sys.exit(1) 

    range_q = RANGE %(sys.argv[1], sys.argv[2]) 


    print(QUERY %(range_q)) 

Das Skript verwendet auch eine Bool-Abfrage. Es sollte ziemlich einfach sein, das zu entfernen und nur die Zeitbeschränkungen für den Bereich zu verwenden.

Ich hoffe, das ist, was Sie suchen.

./range_prefix_query.py.tmp 2016-08-10T00:00:00.000Z 2016-08-10T00:00:00.000Z 
{"query":{"bool":{"must":[{"prefix": {"myType":"test"}},{"range":{"@timestamp":{"gte":"2016-08-10T00:00:00.000Z","lt":"2016-08-10T00:00:00.000Z"}}}]}}} 

Artur

+0

Ja, das sollte funktionieren. Ich weiß nicht, wie ich den Rest meiner Anfrage im JSON-Format ausdrücken soll, was mein Problem war. Kannst du mir auf eine Ressource hinweisen, wo ich das auch tun kann? –

+0

Verwenden Sie Java mit ES? Für die Abfragen verwende ich 2 Shortcuts: 1. Verwenden Sie kibana + Inspection Tools, um zu sehen, welche Art von Abfrage kibana an ES sendet, wenn Sie nach Ihren Daten fragen. 2. Verwenden Sie die Java-Client-Implementierung und erstellen Sie dort Ihre Abfrage programmatisch (mit den Objekten). Das Client-Impl ist so konzipiert, dass die toString-Methode genau den JSON-Inhalt ausgibt, den Sie verwenden müssen. – pandaadb

+0

Ich benutze tatsächlich Python, aber ich kann wahrscheinlich das gleiche tun. –