Python эластичный поиск диапазона запроса

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

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)

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

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

Артур

Взгляните на https://elasticsearch-dsl.readthedocs.io/en/latest/

        s = Search()\
            .filter("term", **{"name": name})\
            .query(q)\
            .extra(**paging)

Другие вопросы по тегам