OpenSearch按近当前、半年、一年时间点查询数据求助
解决OpenSearch查询指定时间点最近数据的问题
原查询无结果的原因
你用latest_data_flag:1过滤是核心问题——这个标记应该只有当前最新的一条数据是1,之前插入的旧数据都会被设为0。当你查询半年前、一年前的时间点时,那个时间点对应的"最新数据"现在已经不是最新的了,flag早改成0了,自然查不到结果。
正确的查询方法
不需要依赖latest_data_flag,直接根据export_timestamp找目标时间点附近的记录即可,分三种场景:
1. 查询当前最新插入的数据
直接按时间倒序取第一条:
{ "size": 1, "query": { "match_all": {} }, "sort": [ { "export_timestamp": "desc" } ] }
如果想用latest_data_flag,这个查询也可以简化成:
{ "size": 1, "query": { "term": { "latest_data_flag": 1 } } }
因为只有最新的一条是1,不需要额外排序也能拿到。
2. 查询半年前时间点附近的最近数据
先算出半年前的时间戳(比如当前时间戳减去约15778463秒,对应半年的秒数),然后查询小于等于该时间戳的记录里,时间戳最大的那条:
{ "size": 1, "query": { "range": { "export_timestamp": { "lte": 1674528000 // 替换为你计算出的半年前时间戳 } } }, "sort": [ { "export_timestamp": "desc" } ] }
3. 查询一年前时间点附近的最近数据
和半年前的逻辑一致,把lte的值换成一年前的时间戳(当前时间戳减去约31556926秒):
{ "size": 1, "query": { "range": { "export_timestamp": { "lte": 1642992000 // 替换为你计算出的一年前时间戳 } } }, "sort": [ { "export_timestamp": "desc" } ] }
一次性查询三个时间点的数据
如果不想分三次请求,可以用OpenSearch的_msearch接口,把三个查询放在同一个请求里,Python示例代码:
queries = [ {"index": self.index_name}, {"size": 1, "query": {"match_all": {}}, "sort": [{"export_timestamp": "desc"}]}, {"index": self.index_name}, {"size": 1, "query": {"range": {"export_timestamp": {"lte": 1674528000}}}, "sort": [{"export_timestamp": "desc"}]}, {"index": self.index_name}, {"size": 1, "query": {"range": {"export_timestamp": {"lte": 1642992000}}}, "sort": [{"export_timestamp": "desc"}]} ] response = self.es.msearch(body=queries) # 解析结果:response['responses'][0]是当前最新数据,[1]是半年前的,[2]是一年前的
内容的提问来源于stack exchange,提问作者user14073111
相关产品推荐
相关产品推荐

