python - Python Elasticsearch范围查询

标签 python elasticsearch elasticsearch-py

我知道除了this one以外,还有几种其他的用于Python的elasticsearch客户端。但是,我没有访问权限。我如何编写一个时间戳具有“小于或等于”逻辑的查询?我目前的做法是:

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)

这是一种非常笨拙的方式。有没有办法让我的查询保持使用字符串并包含范围?

最佳答案

我有一个小脚本可以为我生成查询。但是查询是在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(boolean) 查询。删除它并仅使用该范围的时间限制应该相当容易。

我希望这是您要寻找的。

可以调用它并发出一个查询,例如:
./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"}}}]}}}

阿图尔

关于python - Python Elasticsearch范围查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41962085/

相关文章:

elasticsearch - 定义 _parent 字段的路径

elasticsearch watcher 无法解析搜索输入

python - 如何将 Perl Map 函数转换为 Python?

python - 关于so​​cket.socket()的澄清

python - 你应该如何读取二维整数数组?

python - 如何使用在 docker 容器中运行的 python 脚本创建(dockerized)Elasticsearch 索引?

django - ElasticSearch-python中的完成建议的批量索引

python - 最简单的方法来 "store"一个类上的函数而不绑定(bind)它?

java - Spring Data Elasticsearch 何时支持服务器版本 7.1?

filter - 为 Elasticsearch 标准化英式和美式英语