在几分钟之内获取超过特定年龄的Elasticsearch文档

时间:2019-06-21 01:56:28

标签: python elasticsearch

如果某些文档在unix时间戳之前被单独查询过,则我在其中有一个字段:

"timelock": 1,561,081,724.254

如果某些文档从未被单独查询过,则没有此文件。我还希望有一个查询,该查询仅返回没有该字段或没有该字段但其时间戳记与当前时间之间的差大于10分钟(600秒)的文档

documents = es.search(index='index', size=10000, body={
    "query": {
        "bool": {
            "must": [
                {
                    "match_all": {}
                },


            ],
            "filter": [],
            "should": [],
            "must_not": [           

            ]
        }
    }})

所以我想用伪代码可以做到:

if 'timelock' exists:
    if current_time - 'timlock' > 600:
        include in query
    else:
        exclude from query
else:
    include in query

我将python模块用于ES。

2 个答案:

答案 0 :(得分:1)

我不了解python语法,但是我可以通过sudo代码建议使用以下逻辑:

compare_stamp = current_timestamp - 600
if 'timelock' exists:
    if timelock < compare_stamp:
        include document
    else:
        exclude document
else:
    include document

因为您可以轻松地在Python脚本中获取compare_stamp。然后可以在以下弹性查询中使用该值:

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "timelock"
                }
              }
            ]
          }
        },
        {
          "range": {
            "timelock": {
              "lt": compare_timestamp
            }
          }
        }
      ]
    }
  }
}

答案 1 :(得分:1)

为什么不简单地使用date math

{
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "timelock"
                }
              }
            ]
          }
        },
        {
          "range": {
            "timelock": {
              "lt": "now-10m"
            }
          }
        }
      ]
    }
  }
}