2017-01-31 7 views
0

Я знаю, что существует несколько альтернативных клиентов elasticsearch для python за пределами this one. Однако у меня нет доступа к ним. Как написать запрос с логикой «меньше или равно» для метки времени? Мой нынешний способ сделать это:Python elasticsearch range query

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) 

Это действительно неуклюжий способ сделать это. Есть ли способ сохранить генерацию запроса с помощью строк и включить диапазон?

+0

ли вы хотите только запрос? У меня есть небольшой скрипт, который генерирует правильный запрос (для меня), который я использую с помощью es2csv. Он генерирует правильный json-запрос – pandaadb

+0

@pandaadb да, мне нужен код для генерации запроса. В принципе, возможность генерации запросов на основе «lte» или «gte» условностей. –

ответ

1

У меня есть небольшой скрипт, который генерирует запрос для меня. Запрос, однако, находится в json-нотации (которую, я считаю, клиент может использовать).

вот мой сценарий:

#!/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)) 

Сценарий также использует запрос BOOL. Это должно быть довольно легко удалить и использовать только временные ограничения для диапазона.

Надеюсь, это то, что вы ищете.

Это можно назвать и выплевывает такой запрос:

./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"}}}]}}} 

Артур

+0

Да, это должно сработать. Я не знаю, как выразить остальную часть моего запроса в формате JSON, хотя это и было моей проблемой. Можете ли вы указать мне на ресурс, где я могу это сделать? –

+0

Вы используете java с ES? Для запросов я использую 2 ярлыка: 1. Используйте инструменты kibana + для проверки того, какой запрос кибана отправляет в ES при запросе ваших данных. 2. Используйте реализацию java-клиента и создайте свой запрос там программно (используя объекты). Клиент impl спроектирован таким образом, что метод 'toString' выплюнет точный json-контент, который вам нужно использовать. – pandaadb

+0

На самом деле я использую python, но я, вероятно, могу сделать то же самое. –