【问题标题】:elasticsearch: How to search the results within last 30 seconds?elasticsearch:如何在最后 30 秒内搜索结果?
【发布时间】:2018-08-22 12:51:21
【问题描述】:

我有两个 Python 客户端代码。每 30 秒运行一次,并将数据提交给 elasticsearch。另一个每30秒运行一次,下载第一个程序提交的数据并分析数据。

在第二个程序中,我想限制 SEARCH 函数只获取最近 30 秒内提交的数据(因为之前的数据已经下载)。

我有一个搜索命令(修改自https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html):

POST /my_index_*/_search
{
  "size": 10,
  "query": {
    "match_all": {},
    "range": {
      "date": {
        "gte": "now-30s/d",
        "lt": "now/d"
      }
    }
  }
}

但它返回一个错误。

{
  "error": {
    "root_cause": [
      {
        "type": "parsing_exception",
        "reason": "[match_all] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
        "line": 5,
        "col": 5
      }
    ],
    "type": "parsing_exception",
    "reason": "[match_all] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
    "line": 5,
    "col": 5
  },
  "status": 400
}

我认为错误肯定来自range 条件,因为没有它我可以很好地获取数据。

我该怎么做?有没有比限制 30 秒的持续时间更好的方法来确保第二个程序永远不会有一个数据超过一次,而且不会错过任何数据。

非常感谢

【问题讨论】:

  • 你得到什么错误?

标签: elasticsearch


【解决方案1】:

要修复解析失败,您只需从查询中删除 match_all。但作为最佳实践,您应该移动范围查询以过滤上下文,如下所示。

{
    "query":
    {
        "bool":
        {
            "filter":
            {
                "range":
                {
                    "date":
                    {
                        "gte": "now-30s",
                        "lte": "now"
                    }
                }
            }

        }
    }

}

请在此处阅读更多详细信息 - https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html。另外我想你错误地添加了 /d ,因为它会将时间四舍五入到最近的一天。请参阅此处的 DateMath 文档 - https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#date-math

对于查找未处理的记录,解决方案应基于您正在处理的数据类型。但我建议根据最后处理的时间戳构建基本查询,而不是查询最后 30 秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多