elasticsearch:如何在最近30秒内搜索结果?

时间:2018-08-21 06:27:12

标签: elasticsearch

我有两个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秒的持续时间更好的方法了,以确保第二个程序永远不会有一次以上的数据,而且不会丢失任何数据。

非常感谢

1 个答案:

答案 0 :(得分:0)

要解决解析失败,只需从查询中删除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秒进行查询。