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